如何从长十六进制字符串创建python字节对象?

rec*_*ive 77 python hex byte

我在字符串中有一长串十六进制数字,例如

000000000000484240FA063DE5D0B744ADBED63A81FAEA390000C8428640A43D5005BD44

只有更长,几千字节.有没有内置的方法将其转换为python 2.6/3中的字节对象?

Jim*_*son 74

适用于Python 2.7及更高版本,包括python3:

result = bytearray.fromhex('deadbeef')
Run Code Online (Sandbox Code Playgroud)

注意:bytearray.fromhex() Python 2.6中的函数似乎存在错误.python.org文档声明该函数接受一个字符串作为参数,但是在应用时,会抛出以下错误:

>>> bytearray.fromhex('B9 01EF')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: fromhex() argument 1 must be unicode, not str`
Run Code Online (Sandbox Code Playgroud)

  • 还有一步,我想要一个字节字符串(例如Python 3的b'\ x04\xea [...]'),你可以从带有`bytes(bytearray.fromhex('deadbeef'))的bytearray中获取它. (6认同)
  • @berto:在这种情况下,有一个更直接的路径,形式为`binascii.unhexlify()`. (4认同)
  • @LarsH:该方法在旧版 Python 2 版本中不可用。这在今天已经不重要了,但在 2016 年却是一个问题。 (2认同)

vil*_*ili 58

result = bytes.fromhex(some_hex_string)
Run Code Online (Sandbox Code Playgroud)

  • 如果我没有弄错的话,只适用于Python 3+ (14认同)
  • 这似乎是完成原始帖子要求的最直接的方法。这有没有被接受的答案的原因吗? (2认同)
  • 当十六进制数字用空格分隔时,fromhex() 方法(字节和字节数组)也将起作用。很方便! (2认同)

Bri*_*ian 40

您可以使用十六进制编解码器执行此操作.即:

>>> s='000000000000484240FA063DE5D0B744ADBED63A81FAEA390000C8428640A43D5005BD44'
>>> s.decode('hex')
'\x00\x00\x00\x00\x00\x00HB@\xfa\x06=\xe5\xd0\xb7D\xad\xbe\xd6:\x81\xfa\xea9\x00\x00\xc8B\x86@\xa4=P\x05\xbdD'
Run Code Online (Sandbox Code Playgroud)

  • `codecs.decode('0a0a0a','hex_codec')`应该适用于2.x和3.x :-) (15认同)

Cre*_*esh 36

试试binascii模块

from binascii import unhexlify
b = unhexlify(myhexstr)
Run Code Online (Sandbox Code Playgroud)

  • 在2.x中有两种方法,在3.x中有三种方式.这么多"只有一种方法可以做到"...... (7认同)
  • 请注意,在Python 3.2中(无论是设计还是我不确定的bug)`unhexlify`现在不接受字符串,而只接受字节.真的很傻,但这意味着你需要使用`b = unhexlify(bytes(myhexstr,'utf-8'))` (2认同)