0

MongoDB の仕様を読んでいて、データ形式BSONを使用しています

ドキュメントを見て、ページの下部にある例の BSON がどのようにエンコードされているかを理解したいと思います

{"hello": "world"}  →   "\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00"

{"BSON": ["awesome", 5.05, 1986]}   →   "\x31\x00\x00\x00\x04BSON\x00\x26\x00 
 \x00\x00\x020\x00\x08\x00\x00 
 \x00awesome\x00\x011\x00\x33\x33\x33\x33\x33\x33
 \x14\x40\x102\x00\xc2\x07\x00\x00 
 \x00\x00"
4

1 に答える 1

1

問題は本質的に「バイナリプロトコルはどのように機能するか」だと思いますか? または、「(疑似)バッカス-ナウア-フォームをどのように読むのですか?」

次のように考えることができます。プロトコルは、データの構造化に使用される形式情報とデータ自体で構成されます。{たとえば、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 ドキュメントのターミネータ。

于 2013-11-01T09:11:44.923 に答える