2013-11-01 24 views
0

我读MongoDB的规格和它使用的数据格式BSONBSON二进制协议如何工作?我如何阅读(伪)Backus-Naur-Form?

望着医生,我想了解如何在其页面底部的例子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" 
+0

你是什么意思,“它是如何工作的”?这是一个二进制协议。 –

+0

我的意思是每个字节是什么意思? – user1297061

+0

使用MongoDB不需要了解BSON数据格式。所有的驱动程序都会隐藏这些细节。你永远不必自己写这些字节。为什么你想再次知道这一点? –

回答

1

我想问题实质上是“二元协议如何工作”?或者`我如何阅读(伪)Backus-Naur-Form?

您可以这样想:您的协议由用于构造数据的格式信息和数据本身组成。例如,您在JSON中看到的作为开头括号{的含义类似于“启动新的(子)文档”。

根据定义,这个'命令'是隐含的,并且简单地包括所有要遵循的内容的长度,然后是内容(e_list),然后是\x00终止字节。因此,由于文档长度为22个字节(十六进制为0x16),“命令”为\x16\x00\x00\x00。为什么三个\x00?因为我们需要一个int32,即一个32位整数,所以它必须填充到四个字节。为什么\x16\x00\x00\x00而不是\x00\x00\x00\x16?这就是所谓的endianess,BSON使用little-endian。然后是。一个e_list被定义为element后跟另一个e_list,它可以是空的,然后终止。一个element被定义为值的第一个类型,然后是e_name,然后是实际数据。因此,由于"hello""world",这是一个字符串,字符串由\x02根据规范确定的,该\x02随之而来的,其次是e_name“你好”和一个空终止(hello\x00)。

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

+1

谢谢,这是一个非常明确的答案。还发现[这个问题](http://stackoverflow.com/questions/16169879/can-i-get-more-explanations-for-bson?rq=1_) – user1297061