我正在将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
工作?
答案 0 :(得分:1)
要将int转换为bool,您只需使用1或0测试结果是否相等。
LastSeenInMinutes = ((flags2 >> 15) & 1) == 1;