Answers:
假设您的十六进制字符串类似于
>>> hex_string = "deadbeef"
>>> hex_data = hex_string.decode("hex")
>>> hex_data
"\xde\xad\xbe\xef"
>>> bytes.fromhex(hex_string) # Python ≥ 3
b'\xde\xad\xbe\xef'
>>> bytearray.fromhex(hex_string)
bytearray(b'\xde\xad\xbe\xef')
请注意,这bytes
是的不变版本bytearray
。
string
> bytes
对象,它是`byte.fromhex(“ 000102030405060708090090A0B0C0D0E0F”)`产生的b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'
。由于问题要求字节数组,因此不作为答案发布,而是将其发布在这里,因为这是我搜索字节的十六进制时获得的第一击。
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
。
bytes.fromhex
当输入字符串的字符数为奇数时,将引发错误:bytes.fromhex("aab")
→ ValueError: non-hexadecimal number found in fromhex() arg at position 3
。
字节数组中有一个内置函数可以满足您的要求。
bytearray.fromhex("de ad be ef 00")
它返回一个字节数组,并读取带或不带空格的十六进制字符串。
hex_string.decode("hex")
不能。
如果我理解正确,则应查找binascii.unhexlify
import binascii
a='45222e'
s=binascii.unhexlify(a)
b=[ord(x) for x in s]
unhexlify
是前往这里的最有效方法,但建议这样b = bytearray(s)
做比使用更好ord
。由于Python具有仅用于字节数组的内置类型,我很惊讶没有人使用它
假设你有一个像这样的字节串
“ \ 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位)无符号
优点是..
您可以指定多个字节和值的字节序
缺点
您确实需要知道您要处理的数据的类型和长度
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
一个好的衬板是:
byte_list = map(ord, hex_string)
这将遍历字符串中的每个字符并通过ord()函数运行它。仅在python 2.6上测试过,不太确定3.0以上版本。
-乔什
byte_list = bytearray(hex_string)