Skip to main content
 首页 » 编程设计

python之如何将十六进制数数组转换为字节数组-python

2025年05月04日8jiqing9006

我在 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'].