将3个字节读取为整数

14

如何将3个字节作为整数读取?

struct模块是否提供类似的功能?

我可以读取3个字节并添加额外的\x00,然后将其解释为4个字节的整数,但这似乎是不必要的。


4
请确保在右端添加NUL。 - Ignacio Vazquez-Abrams
4个回答

16

struct模块没有3字节整数的选项,因此我认为在末尾添加'\x00'是最简单的方法。

In [30]: import struct
In [38]: struct.pack('>3b',0,0,1)
Out[38]: '\x00\x00\x01'

In [39]: struct.unpack('>i','\x00'+'\x00\x00\x01')
Out[39]: (1,)

13

3

如果不使用struct模块,可以选择另一种适用于Python 2的方法:

>>> s = '\x61\x62\xff'
>>> a = sum([ord(b) * 2**(8*n) for (b, n) in zip(s, range(len(s))[::-1])])
>>> print a
6382335

字节顺序为大端(big-endian)。 这与unutbu的答案相同,结果也相同:

>>> print struct.unpack('>I', '\x00' + s)[0]
6382335

对于小端字节序,转换将是这样的:
>>> a = sum([ord(b) * 2**(8*n) for (b, n) in zip(s, range(len(s)))])
>>> print a
16736865
>>> print struct.unpack('<I', s + '\x00')[0]
16736865

1

另一个选项是自己进行位移操作。

大端模式:

ba = # 3 byte bytearray
v = ba[0] << 16 | ba[1] << 8 | ba[2]

小端序
ba = # 3 byte bytearray
v = ba[2] << 16 | ba[1] << 8 | ba[0]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接