Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中将16位无符号整数拆分为字节数组?_Python_Arrays_Struct_Byte - Fatal编程技术网

如何在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

我需要在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)
导入结构 >>>导入数组 >>>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]