2012-09-26 5 views
7

私はビットの範囲を取得する方法を探しています。例えば、私が持っている場合は、バイナリデータバイト配列からビット範囲を読み取る

0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1私は私がに興味があるつまり9までの範囲のビット3からデータを取得する必要があるかもしれません

(2バイト):

ので、簡単に言えば、私は方法を構築するようになる:

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; 

を:

Iボード上にプロジェクトを作成しており、しばしばメモリに値を読み書きする必要があります。 cdf、sfr、またはddf(チップ定義ファイルと呼ばれます)には、特定のチップに関する情報が含まれています。私は効率的なアルゴリズムを持っているとします(毎秒時には80回)の変数の多くを読んでいますので

;  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 

:このファイルは次のように見えるかもしれません。バイトサイズが8の場合、8バイトから長いバイトを作成し、<<>>演算子を使用して、必要なものを取得するというアプローチをとっています。 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[]を受け取り、左と右のシフト演算子を持ちます。

関連する問題