2012-09-26 52 views
7

我正在尋找一種方法,可以使我獲得一系列位。例如,如果我有二進制數據從字節數組中讀取位的範圍

0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1(2個字節)

我可能需要從範圍第3位數據,以9.換句話說,我將是感興趣的:

所以在短我會喜歡構建方法:

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

    // implementation 
} 

因此,如果我通過數據new byte[]{91,215}, 3, 9我會得到byte[]{122}(注意字節91和215 = 0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1和字節122 = 1 1 1 1 0 1 0相同的二進制數據的例子。

這將是很好,如果我可以使用的字節數組的<<運營商如做這樣的事情:

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

如果你有興趣知道爲什麼我需要這個功能:

我我正在電路板上創建一個項目,並且經常需要讀取和寫入內存值。 cdf,sfr或ddf(被稱爲芯片定義文件)包含關於特定芯片的信息。這個文件可能看起來像:

;  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 

因爲我讀了很多的變數(每秒80有時次)我會想有一個高效的算法。我想我的做法是,如果字節大小是8,那麼我會從這8個字節創建一個long,然後使用<<>>運算符來獲得我需要的。如果bytesize如果4,那麼我將創建一個int並使用<<>>運算符,但是如果我需要讀取16個字節,我該怎麼做呢? 我想我的問題應該是如何在自定義結構類型上實現<<>>運算符。

+0

每秒80次?這與3D遊戲在屏幕上繪製幀的速度相同。你不需要一個非常有效的算法。 –

回答

5

您需要系統中的BitArray類System.Collections

+0

這正是我所需要的,但我使用.net 4.0 ... –

+0

http://msdn.microsoft.com/en-us/library/system.collections.bitarray(v=vs.100).aspx這是:) – STO

3

看起來你可以幫助「比特流」。有一個這樣的概念here的實現。看一看,也許它適合你的需求。

+0

請小心這篇文章/實施。 64位讀/寫操作不能正確解碼/編碼數據。它看起來並不像它(文本或代碼)已經超過7年了。 – kornman00

2

.NET 4+中的BigInteger類在構造函數中採用Byte[],並且具有左右移位運算符。