我需要在Python中发送一个字节消息,我需要将无符号整数转换为字节数组。如何在Python中将整数值转换为四个字节的数组?就像在C:
uint32_t number=100;
array[0]=(number >>24) & 0xff;
array[1]=(number >>16) & 0xff;
array[2]=(number >>8) & 0xff;
array[3]=number & 0xff;
有人能告诉我怎么样吗?起初我很奇怪没有类型的程序。
答案 0 :(得分:32)
查看struct
模块。您可能只需要struct.pack("I", your_int)
将整数打包到字符串中,然后将此字符串放在消息中。格式字符串"I"
表示无符号的32位整数。
如果要将这样的字符串解包为整数元组,可以使用struct.unpack("4b", s)
:
>>> struct.unpack("4b", struct.pack("I", 100))
(100, 0, 0, 0)
(示例显然是在小端机器上。)
答案 1 :(得分:15)
这是一个旧线程,但在Python 3.2+中你现在可以简单地说:
number = 100
number.to_bytes(4, byteorder = 'big')
或byteorder = 'little'
根据您的需要。文档here。
答案 2 :(得分:14)
Sven你有答案吗?但是,在Python中也可以使用字节移位数字(如您的问题所示):
>>> [hex(0x12345678 >> i & 0xff) for i in (24,16,8,0)]
['0x12', '0x34', '0x56', '0x78']
答案 3 :(得分:7)
如果有人在某个时候看到这个问题...... 该陈述应该等同于原始问题中的代码:
>>> tuple( struct.pack("!I", number) )
('\x00', '\x00', '\x00', 'd')
我认为主机字节顺序不重要
如果您的整数大于int32,则可以在"!Q"
调用int64时使用pack()
(如果您的系统支持Q
)。
list()
甚至bytearray()
代替tuple()
。
注意,结果是一系列str
个对象(每个对象包含一个字节),而不是整数。如果必须有整数列表,则可以执行以下操作:
[ ord(c) for c in struct.pack("!I", number) ]
[0, 0, 0, 100]
......或者这个:
>>> map( ord, tuple( struct.pack("!I", number) ) )
[0, 0, 0, 100]
但是使用map()
会让事情变得有些混乱。
答案 4 :(得分:4)
你几乎可以做同样的事情:
>>> number = 100
>>> array[0] = (number>>24) & 0xff
>>> array[1] = (number>>16) & 0xff
>>> array[2] = (number>>8) & 0xff
>>> array[3] = number & 0xff
或者你可以做一些更短的事情:
>>> array = [(number>>(8*i))&0xff for i in range(3,-1,-1)]
答案 5 :(得分:1)
也可以使用ctypes
完成。它对于将浮点数转换为字节特别有用。例如:
>>> bytes(ctypes.c_uint32(0x20))
b' \x00\x00\x00'
>>> bytes(ctypes.c_double(1))
b'\x00\x00\x00\x00\x00\x00\xf0?'
答案 6 :(得分:0)
为了完整性:您还可以使用array
模块:
>>> from array import array
>>> a = array('I', [100]) # note that 'I' and such are machine-dependent.
>>> a.tostring()
'\d\x00\x00\x00'
>>> a.byteswap()
>>> a.tostring()
'\x00\x00\x00\d'