2017-01-13 13 views
0

私が取り組んでいるプロジェクトのAPIドキュメントのように、バイト配列に格納されたデータを読み込もうとしています。私はバイト配列を扱うことに慣れていますが、バイト内のビットの表示方法やマインセンスはわかりません。サイドバイト配列のビット情報

この画像は文書のページからenter image description here

ではどのように「IIN」値は24ビット長のバイト数2ビット数7から始まり、バイト番号4で仕上げ及びビット0であると述べていますこのデータを選択して変数に格納しますか?次の拡張方法は達成可能ですか?

 public static int GetSubBitsValue(this byte[] all, int startbyte, int startbit, int endbyte, int endbit) 
    { 
     //magic here 
    } 

答えて

1

バイトには8ビットが含まれます。ビットは2の累乗で番号が付けられているため、最上位ビットから最下位ビットまで7から0になります。したがって:

byte myByte = SomeFunctionToGetAByte(); 
bool isBit7Set = myByte & (2^7); 
bool isBit6Set = myByte & (2^6); 
bool isBit5Set = myByte & (2^5); 
bool isBit4Set = myByte & (2^4); 
bool isBit3Set = myByte & (2^3); 
bool isBit2Set = myByte & (2^2); 
bool isBit1Set = myByte & (2^1); 
bool isBit0Set = myByte & (2^0); 

この値は、ビット7に始まり、ビット0で終わるので、バイト境界に落ちてしまっので、取得するのは簡単であるべき。

長さが24ビットなので、3バイト(24ビット÷8ビット/バイト= 3バイト)を読み込む必要があります。しかし、バイトの順番を知る必要があります。最上位の数字は、まず手書きで書く方法で、Mac/68000アーキテクチャでは一般的です。または最下位の有効数字が最初に表示されます。これは、Wintelアーキテクチャでは一般的です。ドキュメンテーションはあなたにこれを伝える必要があります。

配列内に完全なバイト配列があるとします。

byte[] bytes = GetByteArray(); 

あなたは、すべての3つのバイトをつかむそれらの一方は8ビット左シフト(または2^8又は256を掛け)、(2^16または65536を掛け)別の16ビットを左にシフトする必要があります3つ上のすべてを追加します(またはORの結果は同じになります)。

それは(LSBファースト)リトルエンディアンならフォーマットはBig Endian(最初にMSB)であれば値が

int value = bytes[2] << 16 | bytes[3] << 8 | bytes[4]; 

だろう、それは次のとおりです。

int value = bytes[4] << 16 | bytes[3] << 8 | bytes[2]; 
+0

.NETのintには、31ビット(プラス1つの符号ビット)しか含めることができません。 'uint'は32を保持できます。最大容量の場合、拡張メソッドは64ビットを保持する' ulong'を返すことができ、最大8バイトで動作します。 –

0

私は一度、以下を使用します

bool myBit = (inputByte & (2^7)) == (2^7); 
関連する問題