4 バイトの byte[] 配列があります。また、16 進値 (0x02000000 など) の形式で対応する 4 バイトのビットマスクがあり、これらのマスクを byte[] 配列に対して検証する必要があります。ビット単位の操作で紙の上でそれを行う方法を完全に理解していますが、C#コードで続行する方法がわかりません。マスク内の各バイトを分離し、配列内の対応するバイトに対して検証する必要がありますか、それを行うより良い方法はありますか?
質問する
641 次
3 に答える
1
1 つの方法はBitArray
、4 バイト配列からすべてのビットを の配列として取得するために使用することですboolean
。例えば、
var bits = new BitArray(MyByteArray);
if (bits[7]) {
// then most significant bit of your first byte is set
}
BitArray
配列の最初のバイトの最下位ビットから最後まで、ビットの配列を作成します。
0x02000000 との照合の例は次のようになります。
var controlBits = new BitArray(BitConverter.GetBytes(0x02000000));
// me thinks this sould work too as 0x02000000 is an int32, not a long
// var controlBits = new BitArray(0x02000000);
var mybits = new BitArray(MyByteArray)
for (int bitIndex = 0, bitIndex < bits.Length; bitIndex++) {
if (controlBits[bitIndex] != mybits[bitIndex]) {
launchICBM(destination = "not this continent");
}
}
...
補足として、BitArray の 0x02000000 は、myBits[29] で 1 つのセット ビットのみに変換されると思います。ここで、0x00000001 は myBits[0] に設定された単一ビットです。
于 2013-05-31T07:34:26.977 に答える
0
常に 4 バイト以下を扱う場合、別のアプローチ (正確に必要なものによって異なります。投稿はややあいまいです) は、4 バイトを単純に uint に格納することです。
uint fourBytes = (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3];
...そして、uintを使用して必要な操作/比較/チェックを行います。
于 2013-05-31T07:56:52.780 に答える
0
これにはビット単位の演算子を使用します。このようなものを持っていると思いますか?
byte bitMask1 = 0x00000001;
byte bitMask2 = 0x00000002;
byte bitMask3 = 0x00000004;
byte bitMast4 = 0x00000008;
byte[] testArray = new byte[] { 0x00000003, 0x00000015, 0x0000020, 0x00000002 };
& 演算子を使用して、ビットマスクに対してバイト値をチェックできます。
if ((testArray[0] & bitMask1) > 0)
{
// The bits are set in the value
}
else
{
// The bits are NOT set in the value
}
于 2013-05-31T07:45:01.243 に答える