1

MQTTライブラリを実装しようとしています。チュートリアルによると、メッセージの固定ヘッダーはMQTT、投稿された写真のようになります。

また、同じチュートリアルで、固定ヘッダーのエンコード方法が次のように記述されていることがわかりました。

mqtt.write((byte) ((retain ? 1 : 0) | qos << 1 | (dup ? 1 : 0) << 3 | type << 4));

私の質問は、投稿された固定ヘッダー仕様によると、フィールドretainqosdupおよび には、それぞれ、、および ビットmsg typeが必要です。1214

msg typeフィールドが最大 5 ビット "<<4" に拡張され、フィールドdupが最大4 bits"<<3"に拡張されるのはなぜですか?

Fixed_Header ここに画像の説明を入力

4

1 に答える 1

4

msg type フィールドが最大 5 ビット "<<4" に拡張され、フィールド dup が最大 4 ビット "<<3" に拡張されるのはなぜですか?

<<フィールドを「展開」せず、左にシフトします。

最初は、各数値は次のようになります。

bit: |   7   |   6   |   5   |   4   |   3   |   2   |   1   |   0   |
======================================================================
                                     |------------- type ------------|
                                                             |- dup -|
                                                     |----- qos -----|
                                                             | retain|

各数値がそのフィールドの有効な範囲内にあると仮定すると、それらの数値は既に正しい幅になっています。具体的にtypeは、0 ~ 15 の値を持つことができるため、(最大) 4 ビット幅です。dup0 または 1でretainなければならないので、幅は 1 ビットのみです。qos0 から 3 までの値を持つことができ、これは 2 ビット幅です。

しかし、彼らは間違った場所にいます。それらは下位ビット (3、2、1、0) でスタックします。それらを正しい位置に移動するには、それらを左にシフトする必要があります。

bit: |   7   |   6   |   5   |   4   |   3   |   2   |   1   |   0   |
======================================================================
     |----------- type<<4 -----------|                                
                                     | dup<<3|                        
                                             |---- qos<<1 ---|        
                                                             | retain|

たとえば、dup下に 3 つのスペース (実際には値 0 のビット) が必要なため、 は 3 ビット左にシフトされます。retainすでに正しい場所にあるため、移動する必要はありません。

すべてのビットが正しい場所に配置されると、次のバイトを使用してOR 演算されます。|

bit: |   7   |   6   |   5   |   4   |   3   |   2   |   1   |   0   |
======================================================================
     |----------- type<<4 -----------| dup<<3|---- qos<<1 ---| retain|

これが求められているものです。

于 2014-11-02T14:38:22.097 に答える