如何将十六进制数数组转换为bytespython数组

2024-09-30 06:25:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python中有一个十六进制值数组,我想把它转换成一个数组,这些值被分解成单独的字节,存储为字符串。在

例如:

给出输入

hexValueAr = [0x085F80, 0x0109A53, 0x0188C6D]

我想要输出

^{pr2}$

我想知道是否有一个内置的python函数来完成这个转换,或者其他一些简单的方法来完成转换?在

编辑:我的输入值是作为十六进制值存储在数组中的整数。我的输入数组有48个这样的整数,我只是缩短了它以便于读取。希望这有帮助。在


Tags: 方法函数字符串编辑字节整数数组内置
3条回答
def int_to_hexbytes(i):
    s = '%X' % i
    if len(s) % 2:
        s = '0' + s
    return [s[i:i+2] for i in range(0, len(s), 2)]

def words_to_hexbytes(a):
    ret = []
    for i in a:
        ret += int_to_hexbytes(i)
    return ret

assert int_to_hexbytes(0x0123456789ABCDEF) == ['01', '23', '45', '67', '89', 'AB', 'CD', 'EF']
assert int_to_hexbytes(0x123456789ABCDEF0) == ['12', '34', '56', '78', '9A', 'BC', 'DE', 'F0']

assert words_to_hexbytes([0x123, 0x456, 0x78]) == ['01', '23', '04', '56', '78']
assert words_to_hexbytes([0x085F80, 0x0109A53, 0x0188C6D]) == ['08', '5F', '80', '10', '9A', '53', '18', '8C', '6D']

int_to_hexbytes使用%格式化运算符将整型参数转换为包含其十六进制表示形式的字符串;然后使用列表理解将该字符串每秒钟拆分为一个列表(即每个字节)。注意,由于最左边的字节可能小于0x10,所以代码预先加上一个'0'(即当字符串长度为奇数时)。在

words_to_hexbytes只需迭代数组参数并附加int_to_hexbytes的结果。在

随后的assert只是测试代码的一种快速方法,同时向读者展示预期的结果。在

你的整数是用十六进制编码的这一事实与问题无关。在

hexValueAr = [0x085F80, 0x0109A53, 0x0188C6D]

以及

^{pr2}$

结果是相同的列表。在

Python整数已经有一个方法可以转换为字节:^{}。{a3}很容易转换成{a2}。唯一的问题是,您需要预先知道要使用的字节数。在您的例子中,您可以使用数字3,也可以使用方法^{}来计算它。在

以下是上述方法的一种可能实现方式:

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']

这里的顺序是big-endian:整数的最高字节在数组的最低索引中。在

如果您想将其作为一条直线执行,可以执行以下操作:

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']。在

hexValueAr=['0x085F80','0x0109A53','0x0188C6D']

stripped = list(map(lambda x: x.split('x')[1], hexValueAr))
byte_list = []

for hex_string in stripped:
     for i in range(3):
         byte_list += [hex_string[2*i:2*i+2]]

print(byte_list)

相关问题 更多 >

    热门问题