Zajmuję się biblioteką C# o nazwie BitStream, która umożliwia pisanie i odczytywanie dowolnej liczby bitów do standardowego obiektu C# Stream
. Zauważyłem, co wydawało mi się dziwną decyzją projektową:Projektowanie strumienia bitów w C#
Podczas dodawania bitów do pustego bajtu, bity są dodawane do MSB bajtu. Np
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
Jednak przy przedstawieniu bity w wielu jako wejście, pierwszy bit liczby wejściowego LSB. Na przykład:
//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)
Wydaje mi się niespójny. Ponieważ w tym przypadku, "stopniowo" kopiując bajt jak w poprzednim przykładzie (pierwsze cztery bity, a następnie cztery ostatnie bity), nie otrzymamy oryginalnego bajtu. Musimy skopiować go "wstecz" (najpierw cztery ostatnie bity, potem pierwsze cztery bity).
Czy jest jakiś powód takiego projektu, którego mi brakuje? Jakakolwiek inna implementacja strumienia bitów z tym zachowaniem? Jakie są względy związane z projektem?
Wygląda na to, że strumień bitowy zachowuje się w sposób, który uważam za spójny. Sprawdź, ile przesuwa bajt przed wskaźnikiem src
w .
marginesie:
Pierwszy bajtdodanej, pierwszy bajt w tablicy bajtów. Na przykład
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
Wydaje mi się niespójne. Ponieważ w tym przypadku, gdy "stopniowo" Ale pokazałem to ma znaczenie. Cytat: "kopiowanie bajtów, jak w poprzednim przykładzie (pierwsze cztery bity, a następnie cztery ostatnie bity), nie otrzymamy oryginalnego bajtu. Musimy skopiować go" wstecz "(najpierw cztery ostatnie bity, potem pierwsze cztery bity). " –
Tak jak powiedziałem, kiedy zarówno czytelnik, jak i pisarz zgadzają się na zamawianie bitów, nie ma to znaczenia. IMO należy używać metody BitStream zarówno do odczytu, jak i zapisu. Jeśli masz inne intencje, takie jak czytanie wynikowych bajtów, powinieneś po prostu napisać własny strumień. –