2011-05-31 39 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?' 
相關問題