【问题标题】:Can I get more explanations for BSON?我可以获得更多关于 BSON 的解释吗?
【发布时间】:2013-04-16 16:46:31
【问题描述】:

我试图通过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

通常,如果我想自己编码文档,我如何计算文档的大小?我认为我的问题主要是如何确定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} 对的列表,而键是01 等。我的问题是01 这里也是字符串,对吧?

【问题讨论】:

    标签: json bson


    【解决方案1】:

    问题 1

    在上面的例子中,对于编码后的字节结果,双引号实际上不是结果的一部分,对吧?

    引号不是字符串的一部分。它们用于标记 JSON 字符串

    问题 2

    它是小端格式。但为什么?为什么不采用大端序?

    字节顺序的选择很大程度上取决于偏好。 little endian 的一个优点是常用的平台都是 little endian,因此不需要反转字节。

    问题 3

    示例文档的大小怎么是\x16,即22?

    有22个字节(包括长度前缀)

    问题 4

    通常,如果我想自己编码文档,我如何计算文档的大小?我认为我的问题主要是如何确定 UTF-8 字符串的大小?

    先写出文档,再回去填写长度。

    问题 5

    n 这个例子,有一个数组。根据规范,对于数组,它实际上是一个 {key, value} 对的列表,而 key 是 0、1 等。我的问题是这里的 0、1 也是字符串,对吧?

    是的。准确地说,没有长度前缀的零终止字符串。 (在列表中称为cstring)。就像嵌入的文档一样。

    【讨论】:

    • 第3题,你能帮我算一算吗? UTF8 char 占用多少字节?
    • @JacksonTale UTF8 代码单元需要一个字节。在您的情况下,字符串本身有 10 个字节,3 个空终止符,1 个类型标记和 2*4 长度说明符,总共 22 个。看看示例字符串。
    • 将 Unicode codepoint 编码为 UTF-8 时,您会得到 1-4 个 codeunits。根据定义,UTF-8 代码单元是 8 位。对于 ASCII 范围 (0-127) 中的代码点,代码点将生成单个 UTF-8 代码单元,对于更高的代码点,它将需要更多。为了获得更多乐趣,您有时需要多个代码点来形成单个渲染符号和大量额外的 unicode 复杂性。
    • 那么在这种情况下,如果它们不是ASCII,我该如何计算字符串的长度?
    猜你喜欢
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多