我在 python 中有一个十六进制值数组,我想将它转换成一个由这些值组成的数组,这些值被分解成单独的字节,并存储为字符串。
例如:
给定输入
hexValueAr = [0x085F80, 0x0109A53, 0x0188C6D]
我想要输出
bytesAr = ['08', '5F', '80', ...]
我想知道是否有一个内置的 python 函数来进行这种转换,或者其他一些简单的方法来进行这种转换?
编辑:我的输入值是作为十六进制值存储在数组中的整数。我的输入数组有 48 个这样的整数,我只是将其缩短以使其更易于阅读。希望这会有所帮助。
请您参考如下方法:
您的整数以十六进制编码的事实与问题无关。
hexValueAr = [0x085F80, 0x0109A53, 0x0188C6D]
和
hexValueAr = [548736, 1088083, 1608813]
结果相同。
Python 整数已经有一种方法可以转换为字节:int.to_bytes .之后转换为字符串非常简单(只需使用 str.format 或 hex )。唯一的问题是您需要知道要预先使用的字节数。在您的情况下,您可以使用数字 3,也可以使用方法 int.bit_length计算它。
下面是上述的一种可能实现方式:
from math import ceil
bytesAr = []
for num in hexValueAr:
count = ceil(num.bit_length() / 8)
bytes = num.to_bytes(count, 'big')
bytesAr.extend('{:02X}'.format(x) for x in bytes)
这产生了结果
['08', '5F', '80', '10', '9A', '53', '18', '8C', '6D']
这里的顺序是大端:整数的最高字节在数组的最低索引中。
如果你想做单行,你可以这样做:
bytesAr = ['{:02X}'.format(x) for num in hexValueAr for x in num.to_bytes(ceil(num.bit_length() / 8), 'big')]
这里可能需要注意的是,输入中的不同数字可能会在输出中给出不同数量的元素。例如,如果您的输入是 [0x00AB, 0x109C],第一个元素将产生一个字符串,而第二个将产生 2 个字符串。如果您想避免这种情况,请找到最大字节数需要对您的一个整数进行编码,并使用它代替 ceil(num.bit_length()/8):
byte_count = ceil(max(hexValueAr).bit_length() / 8))
bytesAr = ['{:02X}'.format(x) for num in hexValueAr for x in num.to_bytes(byte_count, 'big')]
在这种情况下,像 [0x00AB, 0x109C] 这样的输入将产生一串零,但每个数字的字节数相等:['00', ''AB' , '10', '9C'].
