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