我有一个长十六进制字符串,表示一系列不同类型的值。我需要将这个十六进制字符串转换为字节或bytearray,这样我就可以从原始数据中提取每个值。我该怎么做呢?

例如,字符串“ab”应该转换为字节b“\xab”或等效的字节数组。再例如:

>>> # what to use in place of `convert` here?
>>> convert("8e71c61de6a2321336184f813379ec6bf4a3fb79e63cd12b")
b'\x8eq\xc6\x1d\xe6\xa22\x136\x18O\x813y\xeck\xf4\xa3\xfby\xe6<\xd1+'

当前回答

假设你有一个这样的字节串

“\x12\x45\x00\xAB”

你知道字节的数量和它们的类型,你也可以使用这种方法

import struct

bytes = '\x12\x45\x00\xAB'
val = struct.unpack('<BBH', bytes)

#val = (18, 69, 43776)

由于我在格式字符串的开头指定了小端序(使用'<'字符),该函数返回了十进制等效值。

0x12 = 18

0x45 = 69

0xAB00 = 43776

B等于一个无符号字节(8位)

H等于两个无符号字节(16位)

更多可用的字符和字节大小可以在这里找到

优点是…

您可以指定多个字节和值的结束序

缺点. .

您确实需要知道您所处理的数据的类型和长度

其他回答

一个好的句子是:

byte_list = map(ord, hex_string)

这将遍历字符串中的每个字符,并通过ord()函数运行它。只在python 2.6上测试过,对3.0+不太确定。

杰克

您可以使用Python标准库中的Codecs模块,即。

import codecs

codecs.decode(hexstring, 'hex_codec')

如果我没理解错的话,你应该找binascii.unhexlify

import binascii
a='45222e'
s=binascii.unhexlify(a)
b=[ord(x) for x in s]

bytearray中有一个内置函数,它可以完成您想要的工作。

bytearray.fromhex("de ad be ef 00")

它返回一个bytearray,读取带或不带空格分隔符的十六进制字符串。

假设你的十六进制字符串是这样的

>>> hex_string = "deadbeef"

将其转换为bytearray (Python 3和2.7):

>>> bytearray.fromhex(hex_string)
bytearray(b'\xde\xad\xbe\xef')

将其转换为字节对象(Python 3):

>>> bytes.fromhex(hex_string)
b'\xde\xad\xbe\xef'

注意,bytes是bytearray的不可变版本。

将其转换为字符串(Python≤2.7):

>>> hex_data = hex_string.decode("hex")
>>> hex_data
"\xde\xad\xbe\xef"