Python3将HEX值列表转换为Bytes

时间:2014-06-16 18:48:24

标签: python python-3.x

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

DATA =  ['FF', 'FF', 'FF', 'FF']

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

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

谢谢!

2 个答案:

答案 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倍的速度差异。