如何在Python中将16位无符号整数分割为字节数组?

2 投票
3 回答
8650 浏览
提问于 2025-04-18 04:39

我需要把一个16位的无符号整数分割成一个字节数组(也就是 array.array('B'))在Python里。

比如说:

>>> reg_val = 0xABCD
[insert python magic here]
>>> print("0x%X" % myarray[0])
0xCD
>>> print("0x%X" % myarray[1])
0xAB

我现在的方法看起来对于这么简单的事情来说,实在是太复杂了:

>>> import struct
>>> import array
>>> reg_val = 0xABCD
>>> reg_val_msb, reg_val_lsb = struct.unpack("<BB", struct.pack("<H", (0xFFFF & reg_val)))
>>> myarray = array.array('B')
>>> myarray.append(reg_val_msb)
>>> myarray.append(reg_val_lsb)

有没有更好、更高效、更符合Python风格的方法来做到这一点呢?

3 个回答

0

你可以像这样写你自己的函数。

def binarray(i):
    while i:
        yield i & 0xff
        i = i >> 8

print list(binarray(0xABCD))
#[205, 171]
0

对于非复数的情况,你可以使用 divmod(a, b) 这个函数,它会返回一个包含商和余数的元组。

下面的例子使用了 map() 来做演示。在这两个例子中,我们只是告诉 divmod 返回一个元组 (a/b, a%b),其中 a=0xABCD,b=256

>>> map(hex, divmod(0xABCD, 1<<8)) # Add a list() call here if your working with python 3.x
['0xab', '0xcd']

# Or if the bit shift notation is distrubing:
>>> map(hex, divmod(0xABCD, 256))

或者你也可以把它们放在一个数组里:

>>> arr = array.array('B')
>>> arr.extend(divmod(0xABCD, 256))
>>> arr
array('B', [171, 205])
2

(这里使用的是Python 3,Python 2在命名上有些不同)

首先,你可以选择把所有东西都保持为bytes类型。这是完全可以的:

reg_val_msb, reg_val_lsb = struct.pack('<H', 0xABCD)

bytes支持“元组解包”(这和struct.unpack没有关系,元组解包在Python中随处可见)。而bytes实际上就是一个字节数组,你可以像你想的那样通过索引来访问它。

b = struct.pack('<H',0xABCD)

b[0],b[1]
Out[52]: (205, 171)

如果你真的想把它转成array.array('B')类型,其实也很简单:

ary = array('B',struct.pack('<H',0xABCD))
# ary = array('B', [205, 171])

print("0x%X" % ary[0])
# 0xCD

撰写回答