2016-12-08 5 views
0

Я распаковываю 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?

ответ

1

Чтобы преобразовать Int к Ему, вы можете просто проверить результат на равенство с 1 или 0.

LastSeenInMinutes = ((flags2 >> 15) & 1) == 1; 
Смежные вопросы