在 Python 中将十六进制字符串转换为字节列表
Posted
技术标签:
【中文标题】在 Python 中将十六进制字符串转换为字节列表【英文标题】:Covert Hexademcial String to Byte list in Python 【发布时间】:2022-01-07 19:14:47 【问题描述】:如何转换十六进制字符串 = a5acf29e4d11f20b6dee54bf369ee0f8
至此 = (bytes([0xa5, 0xac, 0xf2, 0x9e, 0x4d, 0x11, 0xf2, 0x0b, 0x6d, 0xee, 0x54, 0xbf, 0x36, 0x9e, 0xe0, 0xf8])
我尝试了两种方法,但它们以不同的格式显示。
-
使用 bytes.fromhex()
>>> bytes.fromhex('a5acf29e4d11f20b6dee54bf369ee0f8')
b'\xa5\xac\xf2\x9eM\x11\xf2\x0bm\xeeT\xbf6\x9e\xe0\xf8'
-
使用 unhexlify
>>> import binascii
>>> from binascii import unhexlify
>>> unhexlify('a5acf29e4d11f20b6dee54bf369ee0f8')
b'\xa5\xac\xf2\x9eM\x11\xf2\x0bm\xeeT\xbf6\x9e\xe0\xf8'
但是,两种格式的类型是相同的。
>>> type(bytes([0xa5, 0xac, 0xf2, 0x9e, 0x4d, 0x11, 0xf2, 0x0b, 0x6d, 0xee, 0x54, 0xbf, 0x36, 0x9e, 0xe0, 0xf8]))
<class 'bytes'>
>>> type(b'\xa5\xac\xf2\x9eM\x11\xf2\x0bm\xeeT\xbf6\x9e\xe0\xf8')
<class 'bytes'>
无论如何,我只想以字节列表格式显示最终格式
(bytes([0xa5, 0xac, 0xf2, 0x9e, 0x4d, 0x11, 0xf2, 0x0b, 0x6d, 0xee, 0x54, 0xbf, 0x36, 0x9e, 0xe0, 0xf8])
有人可以建议我如何实现这一目标吗?
【问题讨论】:
您是否尝试迭代b'\xa5\xac\xf2\x9eM\x11\xf2\x0bm\xeeT\xbf6\x9e\xe0\xf8'
?你已经得到了你需要的东西。
我认为您不能这样做并保留类型; bytes([0xa5, 0xac, 0xf2, 0x9e, 0x4d, 0x11, 0xf2, 0x0b, 0x6d, 0xee, 0x54, 0xbf, 0x36, 0x9e, 0xe0, 0xf8])
是有效的输入形式,但不是有效的输出形式。您能解释一下您要解决的问题吗?
@snakecharmerb 我正在使用一个 API,它需要 bytes[] 格式的参数,输入字符串是十六进制字符串,如果我通过 bytes.fromhex(str) 它将不起作用,仅当我像 bytes([0xa5, 0xac....]) 那样对其进行硬编码时才有效
你试过用 bytearray.fromhex 代替 bytes.fromhex 吗?
bytes([...])
有效,而b'\x...'
无效,这令人惊讶。 Both are equals
【参考方案1】:
由于您要求以特定格式显示,因此您可以轻松地这样做,因为您的可变数据类型的成本
这样的事情可能会奏效
bytes_from_hex = bytearray.fromhex('a5acf29e4d11f20b6dee54bf369ee0f8')
print("bytes([",", ".join([hex(b) for b in bytes_from_hex]),"])")
for_disp = "bytes(["+", ".join([hex(b) for b in bytes_from_hex])+"])"
print(for_disp)
print(type(for_disp))
如果您希望 byte[] 访问 API,则显示无关紧要,这样的事情应该可以工作
bytearray.fromhex('a5acf29e4d11f20b6dee54bf369ee0f8')
【讨论】:
以上是关于在 Python 中将十六进制字符串转换为字节列表的主要内容,如果未能解决你的问题,请参考以下文章