問題は本質的に「バイナリプロトコルはどのように機能するか」だと思いますか? または、「(疑似)バッカス-ナウア-フォームをどのように読むのですか?」
次のように考えることができます。プロトコルは、データの構造化に使用される形式情報とデータ自体で構成されます。{
たとえば、JSON で左角括弧として表示されるものは、「新しい (サブ) ドキュメントを開始する」のような意味です。
定義によると、この「コマンド」は暗黙的であり、単純に、後続するすべての長さ、コンテンツ ( e_list
)、\x00
ターミネータ バイトで構成されます。したがって、ドキュメントの長さは 22 バイト (16 進数で 0x16) であるため、「コマンド」は\x16\x00\x00\x00
. なぜ3つ\x00
?int32、つまり 32 ビット整数が必要なため、完全な 4 バイトにパディングする必要があります。なぜ\x16\x00\x00\x00
ではないの\x00\x00\x00\x16
ですか?これはエンディアンと呼ばれ、BSON はリトルエンディアンを使用します。
次に、コンテンツの定義であるe_list
. anは、別の e_list が後に続くものe_list
として定義されます。この e_list は空にすることができ、その後終了します。element
Anelement
は、最初に値の型として定義され、次に 、その後e_name
に実際のデータが続きます。そのため、 is の値は文字列であり、文字列は仕様に従ってa で識別されるため、次に が続き、その後に「hello」と null ターミネータ ( ) が続きます。"hello"
"world"
\x02
\x02
e_name
hello\x00
次に、文字列である実際の値が来ます。int32 (byte*) "\x00"
つまり、文字列の長さ、実際のデータ、および null ターミネータ (null ターミネータを含む長さ) として定義されるため、長さは になり\x06\x00\x00\x00
、その後に実際のデータworld\x00
と\x00
トップレベルの BSON ドキュメントのターミネータ。