如何读取整数3个字节?
struct module是否提供类似的东西?
我可以读取3个字节并添加一个额外的\ x00,然后将其解释为4字节整数,但这似乎是不必要的。
答案 0 :(得分:14)
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,)
答案 1 :(得分:12)
我认为从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
答案 2 :(得分: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
字节顺序是big-endian。这给出了与之相同的结果 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
答案 3 :(得分: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]