2

我有一个 4 字节的 byte[] 数组。还有一个相应的 4 字节位掩码以十六进制值的形式(如 0x02000000),我需要根据我的 byte[] 数组验证这些掩码。虽然我完全理解我应该如何在纸上进行按位运算,但我不确定如何在 C# 代码中进行。我应该将掩码中的每个字节分开并根据数组中的相应字节进行验证,还是有更好的方法来做到这一点?

4

3 回答 3

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] 处设置的单个位。

于 2013-05-31T07:34:26.977 回答
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 回答
0

如果您总是处理四个字节或更少,另一种方法(取决于您到底需要什么;帖子有点含糊)是将四个字节简单地存储在一个 uint 中:

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

...然后使用 uint 执行您需要的任何操作/比较/检查。

于 2013-05-31T07:56:52.780 回答