Tôi đang xem thư viện C# có tên là BitStream, cho phép bạn viết và đọc bất kỳ số bit nào với đối tượng C# Stream
tiêu chuẩn. Tôi nhận thấy những gì dường như với tôi một quyết định thiết kế lạ:Thiết kế một BitStream trong C#
Khi thêm bit vào một byte trống, các bit được thêm vào MSB của byte. Ví dụ:
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
Tuy nhiên, khi tham khảo bit trong một số như đầu vào, bit đầu tiên của số đầu vào là LSB. Ví dụ:
//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)
Có vẻ như không phù hợp với tôi. Vì trong trường hợp này, khi "dần dần" sao chép một byte như trong ví dụ trước (bốn bit đầu tiên, và sau đó là bốn bit cuối cùng), chúng tôi sẽ không nhận được byte gốc. Chúng ta cần phải sao chép nó "ngược" (đầu tiên bốn bit cuối cùng, sau đó là bốn bit đầu tiên).
Có lý do nào cho thiết kế mà tôi bị thiếu không? Bất kỳ việc triển khai bit nào khác có hoạt động này không? Những cân nhắc thiết kế cho điều đó là gì?
Dường như ffmpeg
hoạt động bitstream theo cách tôi xem là nhất quán. Nhìn vào số tiền, nó thay đổi byte trước khi OR
nhập nó bằng con trỏ src
trong the put_bits
function.
Như một mặt lưu ý:
Các byte đầu tiên nói thêm, là byte đầu tiên trong mảng byte. Ví dụ
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
Có vẻ như không phù hợp với tôi. Kể từ trong trường hợp này, khi "dần dần" Nhưng tôi chỉ cho thấy nó không quan trọng. Trích dẫn: "sao chép một byte như trong ví dụ trước (bốn bit đầu tiên, và sau đó bốn bit cuối cùng), chúng tôi sẽ không nhận được byte gốc. Chúng tôi cần sao chép nó" ngược "(đầu tiên bốn bit cuối cùng, sau đó bốn bit đầu tiên). " –
Giống như tôi đã nói, khi cả người đọc và nhà văn đồng ý về thứ tự bit, nó không quan trọng. IMO bạn nên sử dụng BitStream để đọc và ghi. Nếu bạn có ý định khác, như đọc các byte kết quả, có lẽ bạn chỉ cần viết luồng của riêng mình. –