【问题标题】:Bitwise operation and type conversion error按位运算和类型转换错误
【发布时间】:2016-12-08 04:39:00
【问题描述】:

我正在将byte[] content 解压缩到一堆字段中。其中大部分直接从字段映射到类型(例如 4 字节 = Uint32)。有些是打包成一个字节的字段。例如 8 个布尔值,或 2 位 + 4 位 + 布尔值 + 布尔值。在下面的构造函数中,我尝试将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
}           

我在 shift 和 mask 操作返回 int 时遇到问题。我终于弄清楚了,尽管 flag1 是一个字节,但按位返回一个导致我分配给属性失败的 int。与 flag2 相同。

现在我的错误是

无法将类型“int”转换为“bool”

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

我是否在做正确的事情来提取这些位域。我该怎么做才能使bool LastSeenInMinutes 工作?

【问题讨论】:

    标签: c# arrays bit-manipulation


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多