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

Posted

技术标签:

【中文标题】python中的十六进制字符串到字节数组【英文标题】:hexadecimal string to byte array in python 【发布时间】:2011-08-04 16:46:24 【问题描述】:

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

【问题讨论】:

这个十六进制字符串长什么样子? 【参考方案1】:

一个好的班轮是:

byte_list = map(ord, hex_string)

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

-乔什

【讨论】:

完美。使用 python 2.7 如果它是正确的,请单击此答案旁边的复选标记的轮廓! :) 这不会转换十六进制 - 它将字符串的每个字符转换为整数。对于十六进制,每对字符代表一个字节。你不妨直接说byte_list = bytearray(hex_string)【参考方案2】:

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

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

【讨论】:

我同意unhexlify 是最有效的方式,但建议b = bytearray(s) 比使用ord 更好。由于 Python 有一个仅用于字节数组的内置类型,我很惊讶没有人使用它【参考方案3】:

您应该能够使用以下方式构建一个保存二进制数据的字符串:

data = "fef0babe"
bits = ""
for x in xrange(0, len(data), 2)
  bits += chr(int(data[x:x+2], 16))

这可能不是最快的方法(许多字符串追加),但仅使用核心 Python 就很简单。

【讨论】:

【参考方案4】:

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

>>> hex_string = "deadbeef"

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

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

或从 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')

请注意,bytesbytearray 的不可变版本。

【讨论】:

如果有人在寻找十六进制 string -> bytes 对象,它是`bytes.fromhex("000102030405060708090A0B0C0D0E0F")`,它会产生b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'。由于问题要求字节数组,因此不作为答案发布,而是在此处发布,因为这是我在搜索十六进制到字节时得到的第一个命中。 @Hubro 实际上,hex_string.decode("hex") 正在开发 Python 2.7。我刚刚在我的Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32 上进行了测试。 @MewX 我说的是 Python 3,不是 Python 2.7 注意当输入字符串有奇数个字符时bytes.fromhex会抛出错误:bytes.fromhex("aab")ValueError: non-hexadecimal number found in fromhex() arg at position 3【参考方案5】:

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

"\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 位)无符号

More available characters and byte sizes can be found here

优点是..

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

缺点..

你真的需要知道你处理的数据的类型和长度

【讨论】:

缺点:那是字节串,不是十六进制串,所以这不是问题的答案。 这是对问题第二部分的回答“...这样我就可以将每个值移出并将其转换为正确的数据类型”。【参考方案6】:

bytearray 中有一个内置函数可以满足您的需求。

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

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

【讨论】:

肯定是最好的答案! 这适用于 Python 3,而 hex_string.decode("hex") 则不行。【参考方案7】:
def hex2bin(s):
    hex_table = ['0000', '0001', '0010', '0011',
                 '0100', '0101', '0110', '0111',
                 '1000', '1001', '1010', '1011',
                 '1100', '1101', '1110', '1111']
    bits = ''
    for i in range(len(s)):
        bits += hex_table[int(s[i], base=16)]
    return bits

【讨论】:

【参考方案8】:

您可以在 Python 标准库中使用Codecs module,即

import codecs

codecs.decode(hexstring, 'hex_codec')

【讨论】:

以上是关于python中的十六进制字符串到字节数组的主要内容,如果未能解决你的问题,请参考以下文章

Python 序列 - bytes 和 bytearray

C# 和 Java 中的十六进制到字节数组给出不同的结果

字节数组到十六进制字符数组的转换[重复]

C中的十六进制到字符数组

如何将十六进制字符串转换为字节数组,以及十六进制字符串中的字节数组?

如何在 Python 中将字符串转换为字节数组