Estoy mirando la biblioteca C# llamada BitStream, que le permite escribir y leer cualquier cantidad de bits en un objeto estándar C# Stream
. Noté lo que me pareció una extraña decisión de diseño:Diseñando un BitStream en C#
Al agregar bits a un byte vacío, los bits se agregan al MSB del byte. Por ejemplo:
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
Sin embargo, cuando se hace referencia bits en un número que el de entrada, el primer bit del número de entrada es el LSB. Por ejemplo
//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)
Me parece inconsistente. Como en este caso, al copiar "gradualmente" un byte como en el ejemplo anterior (los primeros cuatro bits y luego los últimos cuatro bits), no obtendremos el byte original. Necesitamos copiarlo "hacia atrás" (primero los últimos cuatro bits, luego los primeros cuatro bits).
¿Hay alguna razón para ese diseño que me falta? ¿Alguna otra implementación de bits transmite con este comportamiento? ¿Cuáles son las consideraciones de diseño para eso?
Parece que el flujo de bits ffmpeg
se comporta de una manera que considero consistente. Mire la cantidad que cambia el byte antes de OR
ing con el puntero src
en the put_bits
function.
Como una nota:
La primera byte añadió, es el primer byte en la matriz de bytes. Por ejemplo
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
Me parece inconsistente. Como en este caso, cuando "gradualmente" Pero acabo de mostrar que sí importa. Cita: "al copiar un byte como en el ejemplo anterior (los primeros cuatro bits y luego los últimos cuatro bits), no obtendremos el byte original. Necesitamos copiarlo" al revés "(primero los últimos cuatro bits, luego el primeros cuatro bits) ". –
Como dije, cuando tanto el lector como el escritor están de acuerdo en el orden de los bits, no importa. IMO debe usar BitStream para leer y escribir. Si tiene otras intenciones, como leer los bytes resultantes, probablemente solo deba escribir su propia transmisión. –