さまざまなバイナリ形式をデコードするための python スクリプトをいくつか作成しています。各形式には多数の異なるレコードがあり、非常に多くのデータが特定のバイト内の特定のビット範囲にエンコードされています。したがって、コードが乱雑にならないように、デコード コードとフォーマット仕様をきちんと分離する python パッケージを探しています。理想的には、さまざまなバージョンの形式を保持できるようにすることです。以下は、私が探しているものの非常に大まかな概要です。
例my_data_format.xml
:
<format version="1A">
<record name="My first record">
<ignore bytes="2" />
<field name="A simple number" bytes="1" convert_to="int" />
<field name="A simple float" bytes="4" convert_to="float" />
<array name="A list of floats" length="3">
<field bytes="4" convert_to="float"
</array>
<field bytes="2">
<ignore bits="5" />
<bitfield name="First bit-field" num_bits="6" convert_to="uint8" />
<bitfield name="Second bit-field" num_bits="5" convert_to="float" />
</field>
</record>
</format>
Python スクリプトの例my_data_reader.py
:
from binary_schema import load_schema
schema = load_schema('my_data_format.xml')
with open(̈́'myfile.bin', 'rb') as f:
decoded_data = schema.read_record_from_stream('Record header', f)
print(decoded_data)
これは辞書を生成します:
{'A simple float': 3.234,
'A simple number': 3,
'A list of floats': [1., 2., 3.],
'First bit-field': 3,
'Second bit-field': 2.0}
そのようなことはありますか?
私はすでにいくつかのことを見てきました:
プロトコル バッファのようなものがレコードの指定に役立つことは知っていますが、私が理解している限りでは、ビットフィールドとその解釈の指定はサポートされていません。
まさに私が必要としているように見えるDFDLがありますが、私は Java クライアントしか見たことがなく、それは大きくてかさばるソフトウェア パッケージのように見えます (どこかに C バージョンがあるようです)。
私の現在の実装では、うまく機能するコンストラクトを使用していますが、ファイルからスキーマをロードするよりも少し面倒に感じます