問題は本質的に「バイナリプロトコルはどのように機能するか」だと思いますか? または、「(疑似)バッカス-ナウア-フォームをどのように読むのですか?」
次のように考えることができます。プロトコルは、データの構造化に使用される形式情報とデータ自体で構成されます。{たとえば、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 は空にすることができ、その後終了します。elementAnelementは、最初に値の型として定義され、次に 、その後e_nameに実際のデータが続きます。そのため、 is の値は文字列であり、文字列は仕様に従ってa で識別されるため、次に が続き、その後に「hello」と null ターミネータ ( ) が続きます。"hello""world"\x02\x02e_namehello\x00
次に、文字列である実際の値が来ます。int32 (byte*) "\x00"つまり、文字列の長さ、実際のデータ、および null ターミネータ (null ターミネータを含む長さ) として定義されるため、長さは になり\x06\x00\x00\x00、その後に実際のデータworld\x00と\x00トップレベルの BSON ドキュメントのターミネータ。