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

我认为问题本质上是“二进制协议如何工作”?或者`我如何阅读(伪)Backus-Naur-Form?

您可以这样想:您的协议由用于构造数据的格式信息和数据本身组成。例如,您在 JSON 中看到的左括号{表示“开始一个新的(子)文档”之类的东西。

根据定义,此“命令”是隐含的,仅包含要遵循的所有内容的长度,然后是内容(an e_list),然后是\x00终止符字节。因此,由于文档长 22 个字节(即 0x16 十六进制),“命令”是\x16\x00\x00\x00. 为什么是三个\x00?因为我们需要一个 int32,即一个 32 位整数,所以它必须被填充到一个完整的四个字节。为什么\x16\x00\x00\x00而不是\x00\x00\x00\x16?这称为字节序,BSON 使用小字节序。

然后是内容的定义,e_list. ane_list定义为 anelement后跟另一个 e_list,它可以为空然后终止。Anelement首先定义为值的类型,然后是e_name,然后是实际数据。因此,由于 is 的值一个字符串,并且根据规范由 a 标识字符串,因此接下来是"hello" 和空终止符 ( )。"hello""world"\x02\x02e_namehello\x00

现在是一个字符串的实际值,它定义为int32 (byte*) "\x00",即字符串的长度,实际数据和一个空终止符(长度包括空终止符),所以长度变成了\x06\x00\x00\x00,后面是实际数据world\x00\x00顶级 BSON 文档的终止符。

于 2013-11-01T09:11:44.923 回答