14

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

struct 模块是否提供类似的东西?

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

4

4 回答 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,)
于 2012-04-18T19:42:15.827 回答
13

我认为从 3.2 开始,int开发了一种新方法.from_bytes,因此您可以使用以下方法代替struct.unpack

int.from_bytes(b'\x00\x00\x01', 'big')  
# 1

如需参考,请参阅:http ://docs.python.org/dev/library/stdtypes.html#int.from_bytes

于 2013-05-28T22:49:55.553 回答
3

python 2 且没有模块的替代方案struct是:

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

其中字节顺序为大端。这给出了与unutbu答案相同的结果 :

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

对于 little-endian 字节排序,转换将是:

>>> 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
于 2015-11-05T15:54:51.880 回答
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]
于 2020-04-02T20:51:27.427 回答