2017-02-06 3 views
0

ContikiOSのCoAP実装を見ています。特にヘッダー解析時に2つの操作を理解する上で問題があります。コードは以下の通りです。Cでバッファ解析を行う

coap_pkt->version = (COAP_HEADER_VERSION_MASK & coap_pkt->buffer[0]) >> COAP_HEADER_VERSION_POSITION; 
coap_pkt->type = (COAP_HEADER_TYPE_MASK & coap_pkt->buffer[0]) >> COAP_HEADER_TYPE_POSITION; 

coap_pktは、パケットと解析された値を格納する構造体です。

  • バージョンuint8_t(unsigned char型)は
  • バッファを入力され、パケット
  • を収容COAP_HEADER_VERSION_MASK値COAP_HEADER_VERSION_POSITION 0xC0の
  • ある6
  • タイプ値は4との列挙型構造であります値
  • COAP_HEADER_TYPE_MASKの値は0x30
  • COAP_HEADER_TYPE_POSITIONの値は4
  • です。

CoAP RFC 7252によれば、バージョンとタイプの両方が2ビットを占めているので、マスク操作と使用された値は私には合理的です。

私の質問は、2つの演算でシフト値が異なるのはなぜですか、それはunsigned charともう1つのenum構造体を使用するものと何か関係がありますか?

答えて

1

基本的には、両方の値を最下位ビットにシフトします。

バージョンビットは最上位ビットですので、ビット7と6としましょう。したがって、マスクを適用した4つの値は0xC0、0x80、0x40、0x00です。後で使用するために、例えば。バージョン比較では、範囲を3,2,1,0に変更する方が便利かもしれないので、6ビットシフトするとビット1と0に値が移動します(この場合、マスクは不要です。

これはタイプビットでも同じ話ですが、ビット5と4はマスク適用後に0x30,0x20,0x10、0x00となります。 4ビットシフトするとそのビットは1と0に移動します。

+0

OK、私はそれを得ると思います。最初の操作は2ビットしか保持しませんが、シフトによって適切な位置に配置されます。 6値と4は混乱していました。今私はその違いを理解する。 ありがとう! –

関連する問題