Je regarde la bibliothèque C# appelée BitStream, qui vous permet d'écrire et de lire n'importe quel nombre de bits sur un objet C# Stream
standard. J'ai remarqué ce qui m'a semblé une décision de conception étrange:Conception d'un BitStream en C#
Lors de l'ajout de bits à un octet vide, les bits sont ajoutés au MSB de l'octet. Par exemple:
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
Cependant, lors du référencement bits dans un nombre comme entrée , le premier bit du nombre d'entrée est le bit de poids faible. Par exemple
//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)
Cela semble incohérent pour moi. Puisque dans ce cas, lors de la copie "progressive" d'un octet comme dans l'exemple précédent (les quatre premiers bits, puis les quatre derniers bits), nous n'obtiendrons pas l'octet d'origine. Nous devons le copier "en arrière" (d'abord les quatre derniers bits, puis les quatre premiers bits).
Y a-t-il une raison pour cette conception qui me manque? Toute autre mise en œuvre de bits flux avec ce comportement? Quelles sont les considérations de conception pour cela?
Il semble que ffmpeg
bitstream se comporte d'une manière que je considère cohérente. Regardez le montant qu'il déplace l'octet avant OR
avec le pointeur src
dans the put_bits
function.
Comme une note de côté:
Le premier octet ajouté, est le premier octet dans le tableau d'octets. Par exemple
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
Cela semble incohérent pour moi. Depuis dans ce cas, quand "progressivement" Mais je viens de le montrer a de l'importance. Citation: "copier un octet comme dans l'exemple précédent (les quatre premiers bits, puis les quatre derniers bits), nous n'obtiendrons pas l'octet original, nous devons le copier" en arrière "(d'abord les quatre derniers bits, puis le quatre premiers bits). " –
Comme je l'ai dit, lorsque le lecteur et l'auteur sont d'accord sur l'ordre des bits, cela n'a pas d'importance. IMO vous devriez utiliser le BitStream pour lire et écrire. Si vous avez d'autres intentions, comme lire les octets qui en résultent, vous devriez probablement écrire votre propre flux. –