Я распаковываю byte[] content
в кучу полей. Большая часть его непосредственно отображает из поля в тип (например, 4 байта = Uint32). Есть некоторые поля, заполненные байтом. например 8 bools, или 2 бит + 4 бит + 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
}
У меня были проблемы с операциями shift и mask, возвращающими int. Я, наконец, решил, что, несмотря на то, что флаг1 является байтом, побитовое возвращает int, из-за чего мой присваивание свойства терпит неудачу. То же самое с флагом2.
Теперь моя ошибка в том, что
Невозможно преобразовать тип «Int» в «BOOL»
Это при попытке извлечь последнее поле. Это последний бит в UInt16
Я делаю правильную вещь, чтобы извлечь эти битовые поля. Что делать, чтобы сделать работу bool LastSeenInMinutes
?