C# を使用してバイナリ ファイルを読み込んでいます。ファイルタイプの仕様によると、1バイトに6つのものがパックされています[8]。ただし、最初の変数は0〜19ビットです。2 番目の変数は 20 ~ 39、3 番目は 40 ~ 59、4 番目は 60 ~ 62、63 ビットはブール値です。これらのビットを意味のあるデータに変換するにはどうすればよいですか? これらの変数はすべて、最後のビットを除いて uint です。
質問する
400 次
1 に答える
4
バイトがあなたのバイト[8]であるとしましょう。また、バイトがビッグ エンディアンであるとしましょう。つまり、最初のビットが最も重要です ( http://en.wikipedia.org/wiki/Endianness ) 。
0 1 2 3 4 5 6 7
11111111 11111111 11112222 22222222 22222222 33333333 33333333 3333444B
int first = bytes[0] << 12 + bytes[1] << 4 + (bytes[2] >> 4)&0xF;
int second = (bytes[2]&0xF) << 16 + bytes[3] << 8 + bytes[4];
int third = bytes[5] << 12 + bytes[6] << 4 + (bytes[7] >> 4)&0xF;
int fourth = (bytes[7] >> 1)&0x8;
bool flag = bytes[7]&0x1 == 1 ? true : false;
基本的に、ここには 2 つの主要な操作があります。
<<
>>
左オペランドのビットを右オペランドのビット数だけ左または右にシフトします。そう00101101 >> 4 = 00000010
そして00101101 << 4 = 11010000
&0x?
ビットマスクです。& はビットのすべてのペアを比較し、両方のビットが 1 の場合のみ結果が 1 になり、それ以外の場合は 0 になります。マスク内の 1 のみが伝搬を許可され、その他は消去されます。
00101101&0xF = 00001101
と00101101&0x1 = 00000001
(注: 0xF は 00001111 で、0x1 は 00000001 です)
ここで C# 演算子について読んでください: http://msdn.microsoft.com/en-us/library/6a71f45d(v=vs.71).aspx
バイトがリトル エンディアンの場合、ビット調整は異なります。
于 2013-05-15T01:36:48.433 に答える