如何将 32 位整数编码为字节数组?

Jam*_*mie 2 python arrays string

我需要通过串行连接发送一个 32 位整数,如下所示:0xc6bf6f34应该变成:b'\xc6\xbf\x6f\x34'

为此,我创建了这一点,但是,一如既往后这种编码,我想知道,如果它的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
Run Code Online (Sandbox Code Playgroud)

fal*_*tru 6

如果您使用的是 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
Run Code Online (Sandbox Code Playgroud)

否则,您可以使用struct.packwith <Iformat ( <: little-endian, I: 4-bytes unsigned integer ,请参阅格式字符串 -struct模块文档):

>>> import struct
>>> struct.pack('<I', 0xc6bf6f34)
b'4o\xbf\xc6'
Run Code Online (Sandbox Code Playgroud)

UPDATE /注:如果你想获得大端(或网络端),您应指定'big'具有int.to_bytes

0xc6bf6f34.to_bytes(4, 'big')  # == b'\xc6\xbf\x6f\x34'
Run Code Online (Sandbox Code Playgroud)

>!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)
Run Code Online (Sandbox Code Playgroud)