如何在 Python 中将十六进制字符串转换为字节?
- 2024-12-27 08:46:00
- admin 原创
- 167
问题描述:
我有一个很长的十六进制字符串,它表示一系列不同类型的值。我需要将此十六进制字符串转换为bytes
或,bytearray
以便可以从原始数据中提取每个值。我该怎么做?
例如,字符串"ab"
应转换为字节b"xab"
或等效的字节数组。较长的示例:
>>> # what to use in place of `convert` here?
>>> convert("8e71c61de6a2321336184f813379ec6bf4a3fb79e63cd12b")
b'x8eqxc6x1dxe6xa22x136x18Ox813yxeckxf4xa3xfbyxe6<xd1+'
解决方案 1:
假设你的十六进制字符串是这样的
>>> hex_string = "deadbeef"
将其转换为字节数组(Python 3 和 2.7):
>>> bytearray.fromhex(hex_string)
bytearray(b'xdexadxbexef')
将其转换为字节对象(Python 3):
>>> bytes.fromhex(hex_string)
b'xdexadxbexef'
请注意,bytes
是的不可变版本bytearray
。
将其转换为字符串(Python ≤ 2.7):
>>> hex_data = hex_string.decode("hex")
>>> hex_data
"xdexadxbexef"
解决方案 2:
bytearray 中有一个内置函数可以执行您想要的操作。
bytearray.fromhex("de ad be ef 00")
它返回一个字节数组并读取带有或不带有空格分隔符的十六进制字符串。
解决方案 3:
如果我理解正确的话,你应该寻找 binascii.unhexlify
import binascii
a='45222e'
s=binascii.unhexlify(a)
b=[ord(x) for x in s]
解决方案 4:
假设你有一个像这样的字节字符串
“E «”
并且您知道字节数及其类型,您也可以使用这种方法
import struct
bytes = 'x12x45x00xAB'
val = struct.unpack('<BBH', bytes)
#val = (18, 69, 43776)
当我在格式字符串的开头指定小端字节序(使用“<”字符)时,该函数返回了十进制等效值。
0x12 = 18
0x45 = 69
0xAB00 = 43776
B 等于一个字节(8 位)无符号
H 等于两个字节(16 位)无符号
更多可用字符和字节大小可在此处找到
优点是..
您可以指定多个字节以及值的字节序
缺点..
你确实需要知道处理的数据类型和长度
解决方案 5:
您可以使用Python标准库中的Codecs模块,即
import codecs
codecs.decode(hexstring, 'hex_codec')
解决方案 6:
您应该能够使用类似以下的方法构建一个保存二进制数据的字符串:
data = "fef0babe"
bits = ""
for x in xrange(0, len(data), 2)
bits += chr(int(data[x:x+2], 16))
这可能不是最快的方法(许多字符串附加),但仅使用核心 Python 就相当简单。
解决方案 7:
一个好的句子是:
byte_list = map(ord, hex_string)
这将遍历字符串中的每个字符并通过 ord() 函数运行它。仅在 Python 2.6 上测试过,不太确定 3.0+。
-乔希
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD