27068
mqttプロトコルについて勉強中です。  
ヘッダの中にあるmqttヘッダ全体の長さを表す部分についてよくわからないことがあるので、mqttについて詳しい方がいれば教えていただけないでしょうか。

mqttプロトコルの[固定ヘッダー部(2Byte)]には最初の1Byte目は[メッセージタイプ][dupフラグ][QOSフラグ][Retain]で構成されており、2Byte目はmqtt全体の長さを表す[ヘッダの残りの長さ]で構成されていますが、わからないのは2Byte目の[ヘッダの残りの長さ]についてです。

2Byte目の[ヘッダの残りの長さ]は1Byteで構成されているものの,下記のURLによれば256MBまで表すことができるそうです。  
<http://public.dhe.ibm.com/software/dw/jp/websphere/wmq/mqtt31_spec/mqtt-v3r1_ja.pdf>

上記URLでそれを可能にするアルゴリズムの方法はわかりましたが、わからないのはそのバイナリの置き場所について、上記の仕様を読んでも、日本語力に乏しい自分にはよくわかりませんでした。

固定ヘッダーの1Byte目で以下のようなバイナリがあったとします。

```

    0001 0000
    
```

これはCONNECTメッセージなのはわかりますが、仮に[ヘッダの残りの長さ]が321バイトだったとします。

上記の7ページ目,8ページ目によれば、以下のアルゴリズムで求められるそうですが。(321バイトだった場合)

```

    input X = 321
    
    do
        digit = X % 128
        X = X / 128
        if ( X > 0)
            digit = digit or 0x80
    
        print digit
    
    while(X > 0)
    
```

[出力]以下が上記コードの結果。

```

    193
    2
    
```

出力された結果に対し、以下の計算。

```

    65 + (2 * 128) = 321
    
```

わからないのは、193と2をヘッダのどの部分に置けばよいかがわかりません。

```

    0000 0010(2)と1100 0001(193)
    
```

これをどこに置けばよろしいのでしょうか？

```

    0001 0000(CONNECT)
    
```

と続いた場合、普通に

```

    0000 0010(2)  1100 0001(193)
    
```

と置けばよろしいのでしょうか？

しかし、そうした場合はどこまでが[ヘッダの残りの長さ]を表すのかがわからないと思うのですが・・

MQTTについて詳しい方、ご教授の方宜しくお願いします。
CC BY-SA 3.0
2016-06-25T12:39:30.837
27067
2022-10-06T07:52:56.000
2022-10-06T07:52:56.000
19110
16947
question
network mqtt
MQTTプロトコルの[ヘッダの残りの長さ]についてよくわかりません
> わからないのは、193と2をヘッダのどの部分に置けばよいかがわかりません。

MQTTについては全然詳しくないので、リンク先の仕様書からわかることだけ書くと、

```

    バイト1: 0001 0000(CONNECT)
    バイト2: 1100 0001(193)
            0000 0010(2)
    
```

というバイト並びになります。(2→193の順ではなく、掲載アルゴリズムにより出力された通り193→2の順です。)

> しかし、そうした場合はどこまでが[ヘッダの残りの長さ]を表すのかがわからないと思うのですが・・

上記のように並べると、「8
番目のビット」(最上位ビット)が0のバイトまで「残りの長さ」を表すことがわかります。ちなみにここに置かれるのは、「残りの長さ」であり、「[ヘッダの残りの長さ]」ではないですね。「「残りの長さ」とは、可変ヘッダーの長さ
(12 バイト) とペイロードの長さです。これはマルチバイト・フィールドにすることができます。」と言うことだそうです。

「残りの長さ」は、「1Byteで構成されている」とはどこにも書いておらず、「(最小 1 バイト)」「このプロトコルでは、「残りの長さ」を表すバイト数が最大
4 に制限されます。」と書かれており、1〜4バイトの可変長ですね。
CC BY-SA 3.0
2016-06-25T13:13:46.167
27068
2016-06-25T13:17:59.507
2016-06-25T13:17:59.507
208
13972
27067
answer