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

时间:2014-04-28 22:15:07

标签: python arrays struct byte

我需要在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的方式来完成同样的事情?

3 个答案:

答案 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]