シーケンスの前のバイトがダウンストリーム バイトの解釈を制御するため、ストリームとして解析したいバイト データがあります。したがって、BytesIO は私が望むもののように見えます。しかし、struct モジュールによって提供される機能も使用したいと考えています。しかし、構造体のインターフェースはストリーミングしていません。2つを結婚させる賢い/慣用的な方法はありますか?
例として、データのチャンクの例を次に示します。
b'\n\x00\x02\x90\x10\x00\n\x00\x02`\x10\x00\n\x00\x02\x80\x10\x00'
最初の 4 バイトを unsigned ビッグ エンディアン int (例) としてプルしたいstruct.unpack(fmt='>I'
。次のバイトは 0x10 であるため、もう 1 バイトあるはずであり、それが 0x00 であることがわかります。そして、最初からやり直し、次の 4 (0x0A000290) を読み取り、洗浄、すすぎ、繰り返します。各 4 バイト ID の直後に続くバイトは、さまざまなダウンストリーム読み取り (一部のバイト、一部のショート) をトリガーします。
私は次のようなことができます
stream = b'\n\x00\x02\x90\x10\x00\n\x00\x02`\x10\x00\n\x00\x02\x80\x10\x00'
while stream:
id = struct.unpack('>I', stream[:4])
stream = stream[4:]
...
しかし、それはエレガントとは言えません。