我需要在python中将一个16位无符号整数拆分为一个字节数组(即array.array('B')
)。
例如:
>>> 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)
是否有更好/更有效/更pythonic的方式来完成同样的事情?
答案 0 :(得分:0)
对于非复数,您可以使用divmod(a, b)
,它返回商和元数的余数的元组。
以下示例使用map()
进行演示。在这两个示例中,我们只是告诉divmod返回元组(a/b, a%b), where a=0xABCD and 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])
答案 1 :(得分:0)
(在这里使用python 3,在2中有一些命名差异)
首先,您可以将所有内容保留为bytes
。这完全有效:
reg_val_msb, reg_val_lsb = struct.pack('<H', 0xABCD)
bytes
允许&#34; tuple解包&#34; (与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
答案 2 :(得分:0)
您可以像这样编写自己的函数。
def binarray(i):
while i:
yield i & 0xff
i = i >> 8
print list(binarray(0xABCD))
#[205, 171]