我正在查看名为BitStream的 C# 库,它允许您向标准 C#Stream
对象写入和读取任意数量的位。我注意到在我看来是一个奇怪的设计决定:
将位添加到空字节时,这些位将添加到字节的 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)
对我来说似乎不一致。因为在这种情况下,当像前面的例子一样“逐渐”复制一个字节时(前四位,然后是后四位),我们不会得到原始字节。我们需要“向后”复制它(首先是最后四位,然后是前四位)。
我错过了那个设计有什么原因吗?具有这种行为的比特流的任何其他实现?对此有何设计考虑?
似乎ffmpeg
比特流的行为方式我认为是一致的。在用函数中的指针OR
ing之前查看它移动字节的量。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