2011-05-31 38 views
20

我需要在Python中发送一个字节的消息,我需要将无符号整数转换为字节数组。如何在Python中将整数值转换为四个字节的数组?像在C:如何将整数值转换为python中的四个字节数组

uint32_t number=100; 
array[0]=(number >>24) & 0xff; 
array[1]=(number >>16) & 0xff; 
array[2]=(number >>8) & 0xff; 
array[3]=number & 0xff; 

有人可以告诉我怎么做吗?开始时,我很奇怪没有类型的编程。

回答

11

Sven你有回答。然而,字节偏移数(在你的问题),也可以在Python:

>>> [hex(0x12345678 >> i & 0xff) for i in (24,16,8,0)] 
['0x12', '0x34', '0x56', '0x78'] 
28

看看struct模块。可能所有你需要的是struct.pack("I", your_int)将整数打包成一个字符串,然后将这个字符串放在消息中。格式字符串"I"表示一个无符号的32位整数。

如果你想解开这样一个字符串为整数元组,你可以使用struct.unpack("4b", s)

>>> struct.unpack("4b", struct.pack("I", 100)) 
(100, 0, 0, 0) 

(这个例子显然是little-endian的机器上。)

+6

根据机器上运行的代码,主机字节顺序可能不是您想要的。使用“!I”将一个unsigned int序列化为网络字节序。 – dantje 2011-05-31 12:56:27

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)] 
7

如果有人看这个问题晚些时候...
这个说法应该是相当于代码在原来的问题:

>>> tuple(struct.pack("!I", number)) 
('\x00', '\x00', '\x00', 'd') 

而且我认为它不重要什么主机字节顺序。
如果整数大于int32,则可以在调用pack()的int64时使用"!Q"(如果系统支持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()开始做的事情有点乱。

7

这是一种旧的线程,但在Python 3.2+现在你可以简单地说:

number = 100 
number.to_bytes(4, byteorder = 'big') 

byteorder = 'little'按您的需求。文档here

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' 
0

它可与​​进行为好。将浮点数转换为字节特别有用。例如:

>>> bytes(ctypes.c_uint32(0x20)) 
b' \x00\x00\x00' 
>>> bytes(ctypes.c_double(1)) 
b'\x00\x00\x00\x00\x00\x00\xf0?' 
相关问题