Python 将字节转换为十六进制并返回

Python converting bytes to hex and back

我有一个很长的十六进制字符串,如下所示:"fffffffffffffffff..."。它是经过处理的位图图像(ppm 格式)的一部分。我将字符串转换为可用的数字列表,例如:[255, 255, 255, 255, 255, 255, 255...](后来我从中提取了 RGB 值),但是我无法将数字正确转换回此十六进制字符串。

raw_hex = "fffffffffffffffffff..." # a long string taken from a file
list_of_ints = [int(raw_hex[i:i+2], 16) for i in range(0, len(raw_hex), 2)] # a list of ints, looks like [255,255,255...] 

然后我尝试通过执行以下命令来反转该过程(我想再次从 list_of_ints 获取 raw_hex

reversed_hex = ''.join([format(int(i), 'x') for i in data])

这似乎提供了类似的输出 ("ffffffffffffffffff...")。但是我可以看出它们并不相同,因为 运行 len(raw_hex)len(reversed_hex) 会产生 15000001490871。但是我知道中间命令工作正常,因为 len(list_of_ints) 产生 750000,这正是我所期望的。那么我做错了什么,我怎样才能从整数列表中获取原始的十六进制字符串?

我假设图像原始十六进制包含填充的 0?如果是这种情况,这些填充的 0 在从整数转换回十六进制时会丢失。这可以按如下方式修复:

reversed_hex = ''.join([format(int(i), '02x') for i in data])

有一些方便的函数可以将十六进制字符串转换为字节并返回:

>>> raw_hex = 'ffffffff'
>>> bytes.fromhex(raw_hex)
b'\xff\xff\xff\xff'
>>> ints = list(bytes.fromhex(raw_hex))
>>> ints
[255, 255, 255, 255]
>>> bytes(ints)
b'\xff\xff\xff\xff'
>>> bytes(ints).hex()
'ffffffff'