python中的十六进制字符串到字节数组

Ric*_*ard 130 python bytearray

我有一个长十六进制字符串,表示一系列不同类型的值.我希望将此Hex字符串转换为字节数组,以便我可以将每个值移出并将其转换为适当的数据类型.

tzo*_*zot 206

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

>>> hex_string = "deadbeef"
Run Code Online (Sandbox Code Playgroud)

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

>>> hex_data = hex_string.decode("hex")
>>> hex_data
"\xde\xad\xbe\xef"
Run Code Online (Sandbox Code Playgroud)

或者从Python 2.7和Python 3.0开始:

>>> bytes.fromhex(hex_string)  # Python ? 3
b'\xde\xad\xbe\xef'

>>> bytearray.fromhex(hex_string)
bytearray(b'\xde\xad\xbe\xef')
Run Code Online (Sandbox Code Playgroud)

注意,这bytes是一个不可变的版本bytearray.

  • 如果有人正在寻找十六进制`string` - >`bytes`对象,那就是`bytes.fromhex("000102030405060708090A0B0C0D0E0F")`它产生`b'\ x00\x01\x02\x03\x04\x05\x06\x07\x08 \吨\n\X0B\X0C\r\x0e\x0f'`.因为问题要求字节数组,所以不发布作为答案,但是在这里发布,因为它是我在搜索hext到字节时获得的第一个命中. (21认同)
  • **请注意**,当输入字符串的字符数为奇数时,`bytes.fromhex`会引发错误:`bytes.fromhex(“ aab”)`→`ValueError:fromhex()arg中的非十六进制数字位置3`。 (3认同)

小智 133

在bytearray中有一个内置函数可以执行您想要的操作.

bytearray.fromhex("de ad be ef 00")
Run Code Online (Sandbox Code Playgroud)

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

  • 这适用于Python 3,而`hex_string.decode("hex")`则不适用. (4认同)
  • 肯定是最好的答案! (3认同)

Bru*_*uce 14

如果我理解正确,你应该寻找binascii.unhexlify

import binascii
a='45222e'
s=binascii.unhexlify(a)
b=[ord(x) for x in s]
Run Code Online (Sandbox Code Playgroud)

  • 我同意`unhexlify`是最有效的方法,但是会建议`b = bytearray(s)`比使用`ord`更好.由于Python有一个内置类型只是为了字节数组我很惊讶没有人使用它 (3认同)

Hov*_*ovo 8

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

“ \ x12 \ x45 \ x00 \ xAB”

而且您知道字节数及其类型,也可以使用这种方法

import struct

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

#val = (18, 69, 43776)
Run Code Online (Sandbox Code Playgroud)

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

0x12 = 18

0x45 = 69

0xAB00 = 43776

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

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

可在此处找到更多可用字符和字节大小

优点是..

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

缺点

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

  • 缺点:这是一个字节字符串,而不是十六进制字符串,因此这不是问题的答案。 (2认同)