14

3バイトを整数として読み取るにはどうすればよいですか?

構造体モジュールはそのようなものを提供しますか?

3バイトで読み取り、\ x00を追加して、それを4バイト整数として解釈できますが、それは不要のようです。

4

4 に答える 4

16

構造体モジュールには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

int3.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を参照してください。

于 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

リトルエンディアンのバイト順序の場合、変換は次のようになります。

>>> 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

もう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 に答える