2012-09-26 39 views
7

Tôi đang tìm một phương pháp cho phép tôi nhận được nhiều bit. Ví dụ nếu tôi có dữ liệu nhị phânĐọc khoảng bit từ mảng byte

0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1 (2 byte)

tôi có thể cần phải lấy dữ liệu từ nhiều chút từ 3 đến 9. Nói cách khác tôi sẽ quan tâm đến:

như vậy trong ngắn tôi sẽ muốn xây dựng phương pháp:

byte[] Read(byte[] data, int left, int right){ 

    // implementation 
} 

để nếu tôi chuyển dữ liệu new byte[]{91,215}, 3, 9 Tôi sẽ nhận được byte[]{122} (lưu ý byte 91 và 215 = 0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1 và byte 122 = 1 1 1 1 0 1 0 cùng một dữ liệu nhị phân làm ví dụ.

Nó sẽ được tốt đẹp nếu tôi có thể sử dụng << điều hành trên mảng byte như làm một cái gì đó như:

byte[] myArray = new byte[] { 1, 2, 3 }; 
    var shift = myArray << 2; 

Nếu bạn quan tâm để biết tại sao tôi cần chức năng này:

tôi đang tạo một dự án trên một bảng và thường cần phải đọc và ghi các giá trị vào bộ nhớ. Cdf, sfr hoặc ddf (được xem là tệp định nghĩa chip) chứa thông tin về một con chip cụ thể. Tệp đó có thể trông giống như:

;  Name       Zone  Address  Bytesize Displaybase Bitrange 
;  ----       ----  -------  -------- ----------- -------- 

sfr = "SPI0_CONTROL"    , "Memory", 0x40001000,  4, base=16 
sfr = "SPI0_CONTROL.SPH"   , "Memory", 0x40001000,  4, base=16, bitRange=25-25 
sfr = "SPI0_CONTROL.SPO"   , "Memory", 0x40001000,  4, base=16, bitRange=24-24 
sfr = "SPI0_CONTROL.TXRXDFCOUNT" , "Memory", 0x40001000,  4, base=16, bitRange=8-23 
sfr = "SPI0_CONTROL.INT_TXUR"  , "Memory", 0x40001000,  4, base=16, bitRange=7-7 
sfr = "SPI0_CONTROL.INT_RXOVF" , "Memory", 0x40001000,  4, base=16, bitRange=6-6 

Vì tôi đọc nhiều biến (đôi khi 80 lần mỗi giây), tôi muốn có một thuật toán hiệu quả. Tôi đoán cách tiếp cận của tôi sẽ là nếu byteize là 8 sau đó tôi sẽ tạo ra một dài từ 8 byte sau đó sử dụng các toán tử <<>> để có được những gì tôi cần. nếu byteize nếu 4 thì tôi sẽ tạo một int và sử dụng các toán tử <<>> nhưng làm thế nào tôi sẽ làm điều đó nếu tôi cần đọc 16 byte? Tôi đoán câu hỏi của mình nên là cách triển khai các toán tử <<>> trên các loại cấu trúc tùy chỉnh.

+0

80 lần mỗi giây? Đó là cùng một tốc độ mà một trò chơi 3D vẽ khung hình cho màn hình. Bạn không cần một thuật toán rất hiệu quả. –

Trả lời

5

Bạn cần lớp BitArray từ System.Collections.

+0

Đó là chính xác những gì tôi cần nhưng tôi đang sử dụng .net 4.0 ... –

+0

http://msdn.microsoft.com/en-us/library/system.collections.bitarray(v=vs.100).aspx đó là :) – STO

3

Có vẻ như bạn có thể giúp một "luồng bit". Có một cách thực hiện khái niệm như vậy here. Hãy xem, có lẽ nó phù hợp với nhu cầu của bạn.

+0

Hãy cảnh giác với bài viết/triển khai đó. Các hoạt động đọc/ghi 64 bit không giải mã/mã hóa dữ liệu một cách chính xác. Và nó không giống như nó (văn bản hoặc mã) đã được cập nhật trong hơn 7 năm nay. – kornman00

2

Lớp BigInteger trong .NET 4+ mất Byte[] trong hàm tạo và có các toán tử dịch trái và phải.

Các vấn đề liên quan