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

2024-10-04 11:35:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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

为此,我创建了这个,但是,像往常一样,在这样的编码之后,我想知道是否可以用标准库中的某些东西来改进pythonicism:

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

Tags: to编码标准valuedef整数longba
1条回答
网友
1楼 · 发布于 2024-10-04 11:35:41

如果您使用的是python3.2+,则可以使用^{}

>>> 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格式一起使用(<:little-endian,I:4字节无符号整数,请参见Format strings - ^{} module doc):

^{pr2}$

更新/注释:如果要获取big-endian(或网络endian),则应使用int.to_bytes指定{}:

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

>或{}与{}一起:

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

相关问题 更多 >