我有一个以字符串格式表示的字节列表,例如,当我在Python3.3中打印列表时,我得到以下输出:
DATA = ['FF', 'FF', 'FF', 'FF']
我想将这些转换为字节,例如0xFF,0xFF,0xFF,0xFF。我尝试过bytearray()函数,但这会返回错误。
我猜我在这里错过了一些简单的东西,但我一直在寻找SO和谷歌并且到目前为止没有运气
谢谢!
答案 0 :(得分:6)
由于bytes
函数接受一个iterable,你可以传递一个生成器
>>> bytes(int(x, 16) for x in DATA)
b'\xff\xff\xff\xff'
这比Martijn的方法慢,但更短。
<强>更新:
或者,您可以使用bytes.fromhex
方法
>>> bytes.fromhex(''.join(DATA))
b'\xff\xff\xff\xff'
似乎比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
答案 1 :(得分:5)
在已加入的“字节”上使用binascii.unhexlify()
:
import binascii
bytestring = binascii.unhexlify(''.join(DATA))
演示:
>>> import binascii
>>> DATA = ['FF', 'FF', 'FF', 'FF']
>>> binascii.unhexlify(''.join(DATA))
b'\xff\xff\xff\xff'
请注意,与使用手动转换为整数相比,这方式更快:
>>> 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
这是一个7倍的速度差异。