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


150

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


十六进制字符串看起来如何?
khachik 2011年

Answers:


239

假设您的十六进制字符串类似于

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

请注意,这bytes是的不变版本bytearray


27
如果有人在寻找hex- string> bytes对象,它是`byte.fromhex(“ 000102030405060708090090A0B0C0D0E0F”)`产生的b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'。由于问题要求字节数组,因此不作为答案发布,而是将其发布在这里,因为这是我搜索字节的十六进制时获得的第一击。
矩阵异常2015年

@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

@MewX我说的是Python 3,而不是Python 2.7
Hubro

3
请注意bytes.fromhex当输入字符串的字符数为奇数时,将引发错误:bytes.fromhex("aab")ValueError: non-hexadecimal number found in fromhex() arg at position 3
КонстантинВан

143

字节数组中有一个内置函数可以满足您的要求。

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

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


4
肯定的最佳答案!
Maiku Mori 2014年

5
这可以在Python 3中使用,而hex_string.decode("hex")不能。
Eric O Lebigot

15

如果我理解正确,则应查找binascii.unhexlify

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

4
我同意这unhexlify是前往这里的最有效方法,但建议这样b = bytearray(s)做比使用更好ord。由于Python具有仅用于字节数组的内置类型,我很惊讶没有人使用它
Scott Griffiths

8

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

“ \ x12 \ x45 \ x00 \ xAB”

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

import struct

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

#val = (18, 69, 43776)

正如我在格式字符串的开头指定小尾数(使用'<'char)一样,该函数返回了十进制等效项。

0x12 = 18

0x45 = 69

0xAB00 = 43776

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

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

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

优点是..

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

缺点

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


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

这是对问题“ ...的第二部分”的回答,以便我可以将每个值移出并将其转换为正确的数据类型。
Rainald62 '19

2

您应该可以使用以下方法构建一个包含二进制数据的字符串:

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

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



-3
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

-4

一个好的衬板是:

byte_list = map(ord, hex_string)

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

-乔什


完善。使用python 2.7-
理查德(Richard)

如果答案正确,请单击此答案旁边的复选标记的轮廓!:)
贾森主义

1
这不会转换十六进制-它将字符串的每个字符转换为整数。对于十六进制,每对字符将代表一个字节。您可能只是说byte_list = bytearray(hex_string)
斯科特·格里菲斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.