解像度が圧縮されたバイナリデータを持つファイルで、私はサブバイトのビットをPythonの整数表現に変換したいと思います。これにより、ファイルからのビットを整数として解釈する必要があることを意味します。ファイルからビット(サブバイト)番号を解凍する最速の方法
現在、ファイルをbitarray
個のオブジェクトに読み込み、オブジェクトのサブセットを整数に変換しています。プロセスは機能しますが、かなり遅くて面倒です。おそらくstruct
モジュールを使用して、これを行うより良い方法はありますか?
import bitarray
bits = bitarray.bitarray()
with open('/dir/to/any/file.dat','r') as f:
bits.fromfile(f,2) # read 2 bytes into the bitarray
## bits 0:4 represent a field
field1 = int(bits[0:4].to01(), 2) # Converts to a string of 0s and 1s, then int()s the string
## bits 5:7 represent a field
field2 = int(bits[4:7].to01(), 2)
## bits 8:16 represent a field
field3 = int(bits[7:16].to01(), 2)
print """All bits: {bits}\n\tfield1: {b1}={field1}\n\tfield2: {b2}={field2}\n\tfield3: {b3}={field3}""".format(
bits=bits, b1=bits[0:4].to01(), field1=field1,
b2=bits[4:7].to01(), field2=field2,
b3=bits[7:16].to01(), field3=field3)
出力:
All bits: bitarray('0000100110000000')
field1: 0000=0
field2: 100=4
field3: 110000000=384
フィールドのサイズは、ファイルを通過するときに繰り返されるのか、まったくランダムなのですか。彼らはバイト境界を越えますか? –
1.フィールドは、バイト境界を越えて動作します。 2.フィールドは繰り返されますが、動的に読み込まなければならない未知のサイズのチャンクがあります。 I.私の例では、 'field3'はどのくらい大きな' field4'が必要であるかを教えてくれます。次に、ファイルは 'field1'、' field2'などを繰り返します。 –
はフィールド4のサイズ(バイトまたはビット)ですか?すべてが整数に収まる必要がありますか? – TisteAndii