【发布时间】: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