2016-12-08 3 views
0

byte[] contentを複数のフィールドにアンパックします。そのほとんどはフィールドからタイプへ直接マッピングされます(例えば、4バイト= Uint32)。バイトにパックされたフィールドがいくつかあります。たとえば8個のbool、または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 
}   

私は、シフトとマスク操作がintを返すのに問題がありました。私は最終的に、flag1がバイトであるにもかかわらず、bitwiseがintへの代入を失敗させていたintを返すことに成功しました。 flag2と同じです。

今私のエラーが

が最後のフィールドを抽出しようとするとこれは「ブール」

に型「int型」を変換できませんということです。これはUInt16の最後のビットです

これらのビットフィールドを抽出するのは適切ですか? bool LastSeenInMinutesを動作させるにはどうすればよいですか?ブール値をint型に変換するために

答えて

1

、あなただけの1または0

LastSeenInMinutes = ((flags2 >> 15) & 1) == 1; 
と等しい結果をテストすることができます