2017-06-15 64 views
1

我需要通過串行連接發送32位整數,例如:0xc6bf6f34應該變爲:b'\xc6\xbf\x6f\x34'我如何編碼32位整數到字節數組?

爲此,我創造了這個,但是,總有這樣的編碼後,我想知道,如果它是pythonicism可以用一些標準libary加以改進:

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

如果你正在使用Python 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 

否則,您可以使用struct.pack<I格式(<:小尾數,I:4-b ytes無符號整數,見Format strings - struct module doc):

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

UPDATE/NOTE:如果你想獲得大端(或網絡端),你應該指定'big'int.to_bytes

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

相關問題