4

バイナリ データの解析には、この素敵な小さなパッケージ「コンストラクト」を使用しています。ただし、フォーマットが次のように定義されている場合に遭遇しました。

31     24 23              0
+-------------------------+
| status |  an int number |
+-------------------------+

基本的には上位8ビットをステータスに、残り3バイトを整数に、つまり上位ビットをマスクしたint型です。フォーマットを定義する適切な方法について少し迷っています:

  • 強引な方法は、それを次のように定義し、ULInt32自分自身をビットマスキングすることです
  • 問題を解決するために BitStruct を使用できる方法はありますか?

編集

リトル エンディアンを想定し、jterrace の例と swapped=True の提案に基づいて、これが私の場合にうまくいくと思います。

sample = "\xff\x01\x01\x01"
c = BitStruct("foo", BitField("i", 24, swapped=True), BitField("status", 8))
c.parse(sample)
Container({'i': 66047, 'status': 1})

ありがとう

オリバー

4

2 に答える 2

2

これは、コンストラクトに Int24 型が含まれていれば簡単ですが、そうではありません。代わりに、次のようにビット長を自分で指定できます。

>>> from construct import BitStruct, BitField
>>> sample = "\xff\x01\x01\x01"
>>> c = BitStruct("foo", BitField("status", 8), BitField("i", 24))
>>> c.parse(sample)
Container({'status': 255, 'i': 65793})

注: 値\x01\x01\x0165536 + 256 + 1 = 65793

于 2012-02-02T21:23:26.263 に答える
0
BitStruct("foo",
          BitField("status", 8),
          BitField("number", 24))
于 2012-02-02T21:14:57.553 に答える