2009-09-08 28 views
5

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 

Trả lời

3

Dưới đây là một số lưu ý thêm:

Trong trường hợp boolean - chỉ một chút là cần thiết để đại diện cho đúng hay sai. Khi bit đó được thêm vào đầu luồng, luồng bit là "1." Khi bạn mở rộng luồng đó thành độ dài byte, nó sẽ buộc padding của các bit không đến cuối luồng, mặc dù các bit đó không tồn tại trong luồng để bắt đầu. Vị trí trong luồng là thông tin quan trọng giống như giá trị của các bit và luồng bit "1000000" hoặc 0x80 bảo vệ mong đợi rằng người đọc tiếp theo của luồng có thể có bit đầu tiên họ đọc là bit đầu tiên được thêm vào.

Thứ hai, các loại dữ liệu khác như số nguyên yêu cầu nhiều bit hơn để biểu diễn để chúng chiếm nhiều chỗ hơn trong luồng hơn so với boolean. Việc trộn các kiểu dữ liệu kích thước khác nhau trong cùng một luồng có thể rất phức tạp khi chúng không được căn chỉnh trên các ranh giới byte.

Cuối cùng, nếu bạn sử dụng Intel x86, cấu trúc CPU của bạn là "nhỏ gọn" có nghĩa là LSB đầu tiên giống như bạn mô tả. Nếu bạn cần lưu trữ các giá trị trong luồng dưới dạng người dùng lớn, bạn sẽ cần phải thêm lớp chuyển đổi trong mã của mình - tương tự như những gì bạn đã hiển thị ở trên, tại đó bạn đẩy một byte vào một thời điểm vào luồng theo thứ tự bạn muốn .Điều này là khó chịu, nhưng thường được yêu cầu nếu bạn cần phải interop với các hộp Unix lớn hoặc có thể được yêu cầu bởi một đặc tả giao thức.

Hy vọng điều đó sẽ hữu ích!

1

Có một lý do cho rằng thiết kế mà tôi đang thiếu? 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ì?

Tôi nghi ngờ có bất kỳ ý nghĩa quan trọng nào đằng sau sự giải trừ. Về mặt kỹ thuật nó chỉ không quan trọng miễn là nhà văn và độc giả đồng ý về việc đặt hàng.

+0

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). " –

+0

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. –

1

Tôi đồng ý với Elazar.

Như anh/cô ấy chỉ ra, đây là trường hợp người đọc và người viết KHÔNG đồng ý về thứ tự bit. Trong thực tế, chúng không tương thích.