Python3将HEX值列表转换为Bytes

Bub*_*ubo 3 python python-3.x

我有一个以字符串格式表示的字节列表,例如,当我在Python3.3中打印列表时,我得到以下输出:

DATA =  ['FF', 'FF', 'FF', 'FF']
Run Code Online (Sandbox Code Playgroud)

我想将这些转换为字节,例如0xFF,0xFF,0xFF,0xFF.我尝试过bytearray()函数,但这会返回错误.

我猜我在这里错过了一些简单的东西,但我已经环顾了SO和谷歌并且到目前为止没有运气

谢谢!

vau*_*tah 6

由于bytes函数接受可迭代,您可以传递一个生成器

>>> bytes(int(x, 16) for x in DATA)
b'\xff\xff\xff\xff'
Run Code Online (Sandbox Code Playgroud)

这比Martijn的方法慢,但更短.

更新:或者,您可以使用bytes.fromhex方法

>>> bytes.fromhex(''.join(DATA))
b'\xff\xff\xff\xff'
Run Code Online (Sandbox Code Playgroud)

它似乎比Martijn的解决方案更快

In [24]: %timeit bytes(int(x, 16) for x in DATA)
100000 loops, best of 3: 2.84 µs per loop

In [25]: %timeit bytes.fromhex(''.join(DATA))
1000000 loops, best of 3: 377 ns per loop

In [26]: %timeit binascii.unhexlify(''.join(DATA))
1000000 loops, best of 3: 403 ns per loop
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 5

使用binascii.unhexlify()上加入了"字节":

import binascii

bytestring = binascii.unhexlify(''.join(DATA))
Run Code Online (Sandbox Code Playgroud)

演示:

>>> import binascii
>>> DATA =  ['FF', 'FF', 'FF', 'FF']
>>> binascii.unhexlify(''.join(DATA))
b'\xff\xff\xff\xff'
Run Code Online (Sandbox Code Playgroud)

请注意,这比使用手动转换为整数更快:

>>> import timeit
>>> timeit.timeit("bytes(int(x, 16) for x in DATA)", 'from __main__ import DATA')
1.7035537050105631
>>> timeit.timeit("unhexlify(''.join(DATA))", 'from __main__ import DATA; from binascii import unhexlify')
0.2515432750224136
Run Code Online (Sandbox Code Playgroud)

这是一个7倍的速度差异.