2017-06-15 10 views
1

シリアル接続で32ビット整数を送信する必要があります。0xc6bf6f34は、b'\xc6\xbf\x6f\x34'になります。32ビット整数をバイト配列にエンコードするにはどうすればよいですか?

そのために、私はこれを作成し、しかし、常に、このような符号化後のように、私はそれがpythonicismだ場合は標準libaryで何かを改善することができたと思った:あなたは、Pythonを使用している場合

def ltonlba(value): 
    ''' ltonlba : Long to Network Long Byte Array ''' 
    from socket import htonl 
    value = htonl(value) 
    ba = b'' 
    for i in range(4): 
      ba += chr((value) & 0xff) 
      value >>= 8 
    return ba 

答えて

3

3.2+、あなたはint.to_bytesを使用することができます。

>>> 0xc6bf6f34.to_bytes(4, 'little') # 4 bytes = 32 bits 
b'4o\xbf\xc6' 
>>> 0xc6bf6f34.to_bytes(4, 'little') == b'\x34\x6f\xbf\xc6' 
True 

そうでない場合、あなたは<I形式(<struct.packを使用することができます:リトルエンディアン、I:4-B ytes符号なし整数、Format strings - struct module docを参照してください):

>>> import struct 
>>> struct.pack('<I', 0xc6bf6f34) 
b'4o\xbf\xc6' 

UPDATE/NOTE:あなたはビッグエンディアン(またはネットワークエンディアン)を取得したい場合は、あなたがint.to_bytes'big'を指定する必要があります。

0xc6bf6f34.to_bytes(4, 'big') # == b'\xc6\xbf\x6f\x34' 

>またはstruct.pack!

struct.pack('>I', 0xc6bf6f34) # == b'\xc6\xbf\x6f\x34' big-endian 
struct.pack('!I', 0xc6bf6f34) # == b'\xc6\xbf\x6f\x34' network (= big-endian) 
+0

'struct.pack()'ソリューションはPython 3.2以降でも動作しますか? – Jamie

+0

@Jamie、Python 2.x、3.xの両方で動作します。 Python 2.7.13/3.5.3/3.6.1でテストしました。 – falsetru

+0

@Jamie、あなたの変更を元に戻しました。あなたはあなたの質問に応じてリトルエンディアンを望みません。 – falsetru

関連する問題