如何在python中将16位无符号整数拆分为字节数组?
我需要在python中将一个16位无符号整数拆分为一个字节数组(即如何在python中将16位无符号整数拆分为字节数组?,python,arrays,struct,byte,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 stru
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)
导入结构
>>>导入数组
>>>reg_val=0xABCD
>>>reg_val_msb,reg_val_lsb=struct.unpack(“”,用于可以使用的非复数,它返回一个商元组和其余参数 以下示例使用
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))
(这里使用Python3,在2中有一些术语上的差异)
首先,您可以将所有内容保留为字节
reg_val_msb, reg_val_lsb = struct.pack('<H', 0xABCD)
如果您真的想将其放入一个数组中。数组('B')
,它仍然相当简单:
ary = array('B',struct.pack('<H',0xABCD))
# ary = array('B', [205, 171])
print("0x%X" % ary[0])
# 0xCD
您可以这样编写自己的函数
def binarray(i):
while i:
yield i & 0xff
i = i >> 8
print list(binarray(0xABCD))
#[205, 171]
感谢您的回答。我选择@roippi的答案是因为它更普遍适用(例如可以扩展为将24位整数拆分为字节),这很好,但我想指出的是,divmod()
可以通过向其传递正确的参数来扩展到任何位范围。对于24位:divmod(0xABCD,0xFFFFFF)
。您如何使用divmod将0x123456拆分为0x12、0x34、0x56字节?@cdwilson抱歉,我误解了您最初的评论。当然,如果不进行两次调用,这对divmod不起作用。您能详细说明“元组解包”与结构解包的区别吗?b[0],b[1]
和struct.unpack('不是真的。元组解包只是将一个可数长度n的每个元素分配给n个不同的变量。比如a,b,c=1,2,3
。
ary = array('B',struct.pack('<H',0xABCD))
# ary = array('B', [205, 171])
print("0x%X" % ary[0])
# 0xCD
def binarray(i):
while i:
yield i & 0xff
i = i >> 8
print list(binarray(0xABCD))
#[205, 171]