我试图通过http://bsonspec.org/#/specification了解BSON
,但仍然存在一些问题。
让我们从上面的网站上做一个例子:
{"hello": "world"} → "\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00"
问题1
在上面的例子中,对于编码的字节结果,双引号实际上不是结果的一部分,对吗?
问题2
我了解the first 4 bytes
\x16\x00\x00\x00
是整个BSON文档的大小。
它是little endian
格式。但为什么?为什么不采取big endian
?
问题3
示例文档的大小如何变为\x16
,即22
?
问题4
通常情况下,如果我想自己编码doc,我该如何计算doc的大小?我认为我的麻烦主要是如何决定UTF-8
字符串的大小?
让我们再看一个例子:
{"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"
问题5
在此示例中,有一个数组。根据规范,对于数组,它实际上是{key, value}
对的列表,而密钥是0
,1
等。我的问题是0
, 1
这里也是字符串,对吧?
答案 0 :(得分:2)
问题1
在上面的例子中,对于编码的字节结果,双引号实际上不是结果的一部分,对吗?
引号不是字符串的一部分。它们用于标记JSON字符串
问题2
它是小端格式。但为什么?为什么不采取大端?
字节序的选择在很大程度上取决于偏好。 little endian的一个优点是常用的平台是小端,因此不需要反转字节。
问题3
示例文档的大小如何为\ x16,即22?
有22个字节(包括长度前缀)
问题4
通常情况下,如果我想自己编码doc,我该如何计算doc的大小?我认为我的麻烦主要是如何决定UTF-8字符串的大小?
首先写出文件,然后回去填写长度。
问题5
在这个例子中,有一个数组。根据规范,对于数组,它实际上是一个{key,value}对的列表,而键是0,1,等等。我的问题是0,1这里也是字符串,对吗?
是。没有长度前缀的零终止字符串是准确的。 (在列表中调用cstring
)。就像嵌入式文档一样。