按位运算和类型转换错误

时间:2016-12-08 04:39:01

标签: c# arrays bit-manipulation

我正在将byte[] content打包成一堆字段。其中大部分直接从字段映射到类型(例如4字节= Uint32)。有些字段被打包成一个字节。例如8个bool,或2bits + 4 bits + bool + bool。在下面的构造函数中,我尝试将content解析为类属性。

public RFTagLost(byte[] content)
{
    byte flags1;
    UInt16 flags2;

    int i = 0;

    GatewaySerial = BitConverter.ToUInt32(content, i);
    i += sizeof(UInt32);

    SerialNumber = BitConverter.ToUInt32(content, i);
    i += sizeof(UInt32);

    Token = BitConverter.ToUInt32(content, i);
    i += sizeof(UInt32);

    flags1 = content[i];
    i += sizeof(byte);
    // TODO parse flags
    GatewayMode = (byte)((flags1 >> 0) & 3);            // 2 bits
    LinkType = (byte)((flags1 >> 2) & 3);               // 2 bits
    Reserved = (byte)((flags1 >> 4) & 15);              // 4 bits

    TagType = content[i];
    i += sizeof(byte);

    flags2 = BitConverter.ToUInt16(content, i);
    i += sizeof(UInt16);
    LastSeen = (UInt16)((flags2 >> 0) & 32767);           // 15 bits
    LastSeenInMinutes = (bool)((flags2 >> 15) & 1);     // 1 bit
}           

我遇到了返回int的shift和mask操作的问题。我终于解决了尽管flag1是一个字节,但bitwise返回了一个int,导致我对属性的赋值失败。与flag2相同。

现在我的错误是

  

无法转换类型' int'到了布尔'

这是在尝试提取最后一个字段时。它是UInt16中的最后一位

我是否正确地提取这些位字段。如何使bool LastSeenInMinutes工作?

1 个答案:

答案 0 :(得分:1)

要将int转换为bool,您只需使用1或0测试结果是否相等。

LastSeenInMinutes = ((flags2 >> 15) & 1) == 1;