如何在python中将整数值转换为四个字节的数组

时间:2011-05-31 12:39:03

标签: python

我需要在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;

有人能告诉我怎么样吗?起初我很奇怪没有类型的程序。

7 个答案:

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