验证由几个字节组成的位掩码

时间:2013-05-31 07:29:36

标签: c# .net bit-manipulation

我有一个4字节的byte []数组。还有一个相应的4字节位掩码,其形式为十六进制值(如0x02000000),我需要针对我的byte []数组验证这些掩码。虽然我完全理解我应该如何在纸上进行按位操作,但我不确定如何继续使用C#代码。我应该将掩码中的每个字节分开并根据数组中的相应字节进行验证,还是有更好的方法来实现它?

3 个答案:

答案 0 :(得分: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]我认为;其中0x00000001是myBits [0]设置的单个位。

答案 1 :(得分:0)

您希望为此使用按位运算符。我猜你有类似的东西吗?

byte bitMask1 = 0x00000001;
byte bitMask2 = 0x00000002;
byte bitMask3 = 0x00000004;
byte bitMast4 = 0x00000008;

byte[] testArray = new byte[] { 0x00000003, 0x00000015, 0x0000020, 0x00000002 };

您可以使用&amp ;;检查位掩码的字节值。操作者:

if ((testArray[0] & bitMask1) > 0)
{
    // The bits are set in the value
}
else
{
    // The bits are NOT set in the value
}

答案 2 :(得分:0)

如果你总是处理四个字节或更少的字节,另一种方法(取决于你究竟需要什么;帖子有些模糊)是简单地将四个字节存储在一个uint中:

uint fourBytes = (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3];

...然后使用uint进行所需的操作/比较/检查。