如何在Python中将16位无符号整数分割为字节数组?
我需要把一个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