3バイトを整数として読み取るにはどうすればよいですか?
構造体モジュールはそのようなものを提供しますか?
3バイトで読み取り、\ x00を追加して、それを4バイト整数として解釈できますが、それは不要のようです。
3バイトを整数として読み取るにはどうすればよいですか?
構造体モジュールはそのようなものを提供しますか?
3バイトで読み取り、\ x00を追加して、それを4バイト整数として解釈できますが、それは不要のようです。
構造体モジュールには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,)
int
3.2から、新しいメソッドを開発したと思います。そのため、次の代わりに次.from_bytes
を使用できます。struct.unpack
int.from_bytes(b'\x00\x00\x01', 'big')
# 1
参考のために、http: //docs.python.org/dev/library/stdtypes.html#int.from_bytesを参照してください。
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
リトルエンディアンのバイト順序の場合、変換は次のようになります。
>>> 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]