运营商'&'不能应用于'byte []'和'byte []'类型的操作数

时间:2016-10-09 09:43:44

标签: c# bitwise-and

我正在尝试处理从传感器检索的字节数组。 在检索到的字节数组中,将有一个字节掩码xx-xx-xx-xx,它告诉我哪些数据将在数组中。

传感器遮罩:

DATA_1 0x00000001
DATA_2 0x00000002
DATA_3 0x00000004
DATA_4 0x00000008
DATA_5 0x00000010
DATA_6 0x00000020
DATA_7 0x00000040
DATA_8 0x00000080
DATA_9 0x00000100
DATA_10 0x00000200
DATA_11 0x00000400

例如,这个字节掩码43-05-00-00告诉我data_1,data_2,data_7,data_9,data_11将在响应数组中。我通过在Windows的计算器应用程序中使用按位来知道这一点:在十六进制模式下,键入543,单击“和”按钮,然后键入传感器掩码(1,2,4,8,10,...)。如果结果与传感器掩码(1,2,4,8,10,...)相同,则包含此数据。但我不知道如何在C#中实现这一点。

这是我的理想,但它给了我错误:操作员'&'不能应用于'byte []'和'byte []'

类型的操作数
int[] sensorMaskList = new int[length] {1, 2, 4, 8,... };
internal List<int> GetSelectedData(byte[] byteMask)
{
    List<int> lstDataIndex = new List<int>();
    for (int i = 0; i < sensorMaskList.Length; i++)
    {
        byte[] mask = BitConverter.GetBytes(sensorMaskList[i]);
        if (mask & byteMask == mask)
           lstDataIndex.Add(i);
     }
     return lstDataIndex;
}

有人能给我一些理想吗?提前致谢并抱歉英语不好

2 个答案:

答案 0 :(得分:3)

您可以使用BitArray课程轻松执行和操作

int[] sensorMaskList = new int[length] {1, 2, 4, 8,... };
internal List<int> GetSelectedData(byte[] byteMask)
{
    BitArray byteMaskBits = new BitArray(byteMask);
    List<int> lstDataIndex = new List<int>();
    for (int i = 0; i < sensorMaskList.Length; i++)
    {
        byte[] mask = BitConverter.GetBytes(sensorMaskList[i]);
        BitArray maskBits = new BitArray(mask);
        if(maskBits.And(byteMaskBits) == maskBits)
        {
            lstDataIndex.Add(i);
        }
     }
     return lstDataIndex;
}

答案 1 :(得分:3)

所有错误消息&#34;运营商&#39;&#39;&#39;不能应用于&#39; byte []&#39;类型的操作数和&#39; byte []&#39;&#34;意味着你不能在数组类型的变量上使用按位AND运算符。您只能在单个整数或无符号整数变量上使用它们,或者两个整数或无符号整数可以按位ANDED一起使用。

如果你想为整个数组做这个你可能想要做的是组成另一个大小相等的数组和AND第一个数组中的每个变量,第二个数组中的每个变量在相应的位置,这样第一个数组1中的变量将与数组2中的第一个变量按位ANDED,依此类推。希望这会有所帮助。