2011-05-31 10 views
20

バイトのメッセージをPythonで送信する必要があり、符号なし整数をバイト配列に変換する必要があります。どのように整数値をPythonの4バイトの配列に変換しますか? Cのように:整数値をPythonの4バイトの配列に変換する方法

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) 

(例はリトルエンディアンのマシンでは明らかである。)

+6

このコードが実行されているマシンによっては、ホストバイトオーダーはおそらくあなたが望むものではありません。 "!I"を使用して、符号なしintをネットワークバイトオーダーにシリアル化します。 – dantje

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()(システムでQをサポートしている場合)のint64には"!Q"を使用できます。
list()またはbytearray()でもtuple()の代わりに機能します。

結果は、整数ではなく、str個のオブジェクト(それぞれが1バイトを保持)のシーケンスです。

[ 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?' 
関連する問題