私はBitStreamStream
と呼ばれるC#ライブラリを見ています。これにより、標準のC#オブジェクトに任意の数のビットを読み書きできます。奇妙な設計上の決定に気づきました。
空のバイトにビットを追加すると、そのビットはバイトのMSBに追加されます。例えば:
var s = new BitStream();
s.Write(true);
Debug.Assert(s.ToByteArray()[0] == 0x80); // and not 0x01
var s = new BitStream();
s.Write(0x7,0,4);
s.Write(0x3,0,4);
Debug.Assert(s.ToByteArray()[0] == 0x73); // and not 0x37
ただし、数値のビットを入力として参照する場合、入力数値の最初のビットはLSBです。例えば
//s.Write(int input,int bit_offset, int count_bits)
//when referencing the LSB and the next bit we'll write
s.Write(data,0,2); //and not s.Write(data,data_bits_number,data_bits_number-2)
それは私には矛盾しているようです。この場合、前の例のようにバイトを「段階的に」コピーすると(最初の4ビット、次に最後の4ビット)、元のバイトは取得されません。それを「逆方向」にコピーする必要があります(最初に最後の4ビット、次に最初の4ビット)。
私が見逃しているそのデザインの理由はありますか?この動作を伴うビットストリームの他の実装はありますか?そのための設計上の考慮事項は何ですか?
ffmpeg
ビットストリームは、私が一貫していると考える方法で動作しているようです。関数内のポインターを使用OR
する前に、バイトをシフトする量を確認してください。src
put_bits
補足として:
追加された最初のバイトは、バイト配列の最初のバイトです。例えば
var s = new BitStream();
s.Write(0x1,0,4);
s.Write(0x2,0,4);
s.Write(0x3,0,4);
Debug.Assert(s.ToByteArray()[0] == 0x12); // and not s.ToByteArray()[1] == 0x12