BSON 1.0版本规范

本文翻译自 http://bsonspec.org/spec.html

BSON是用于存储零个或多个键/值对为一个单一的实体的一个二进制格式。我们称这个实体为文档(Document)。

以下语法用于指定BSON标准的1.0版本。我们使用伪BNF语法来(编写)描述。有效数据BSON数据是由非终端显示的文档表示的。

基本类型

以下基本类型用作终端中其余的语法。每种类型必须序列化为小端字节序。

类型 内存宽度 描述
byte 1 byte (8-bits)
int32 4 bytes (32-bit 有符号整数,补码表示)
int64 8 bytes (64-bit 有符号整数,补码表示)
double 8 bytes (64-bit IEEE 754-2008 二进制浮点数)

非终端

下面指定BSON的其他语法。注意,终端引用字符的表示,应该用C语言的语义来理解(例如:"\x01"代表的一个字节,二进制表示为0000 0001)。

同时,我们使用操作法*来速记重复的部分(例如:("\x01"*2)表示的是"\x01\x01")。当作为一元运算符,*表示重复出现0次或以上。

document    ::=	int32 e_list "\x00"	BSON 文档. int32表示的是组成这个文档的总字节数.
e_list ::= element e_list
| ""
element ::= "\x01" e_name double 64-bit二进制浮点数
| "\x02" e_name string UTF-8 字符串
| "\x03" e_name document 内嵌文档
| "\x04" e_name document 数组
| "\x05" e_name binary 二进制数据
| "\x06" e_name 未定义(value) — 不推荐使用
| "\x07" e_name (byte*12) 对象Id
| "\x08" e_name "\x00" 布尔值 "false"
| "\x08" e_name "\x01" 布尔值 "true"
| "\x09" e_name int64 UTC 时间数据
| "\x0A" e_name Null value(空值)
| "\x0B" e_name cstring cstring 正则表达式 - 第一个 cstring 是正则表达式模式,
第二个是正则表达式选项字符串. 选项是一个标记字符, 必须按照字母顺
序存储. 有效的选项是:'i' 不区分大小写匹配, 'm'多行匹配, 'x'详
细模式, 'l'去创建\w, \W,等区域(本地化)依赖设置, 's'dotall匹配
('.' 可以匹配所有字符),以及 'u'去创建 \w, \W 配置.匹配unicode.
| "\x0C" e_name string (byte*12) DB指针 — 不推荐使用
| "\x0D" e_name string JavaScript代码
| "\x0E" e_name string 不推荐使用
| "\x0F" e_name code_w_s JavaScript code w/ scope
| "\x10" e_name int32 32-bit 整数
| "\x11" e_name int64 时间戳
| "\x12" e_name int64 64-bit整数
| "\xFF" e_name Min key
| "\x7F" e_name Max key
e_name ::= cstring Key name
string ::= int32 (byte*) "\x00" String - Int32是总字节数 (byte*) + 1(结尾\x00)。(byte*)是零个
或更多的 utf-8 编码字符。
cstring ::= (byte*) "\x00" 零个或更多修改 UTF-8 编码字符后,以\x00结尾。(byte*)中必须不
包含'\x00',因此它不是完全UTF-8。
binary ::= int32 subtype (byte*) Binary - int32 是(byte*)字节数.
subtype ::= "\x00" Generic binary 子类型
| "\x01" Function
| "\x02" Binary (Old)
| "\x03" UUID (Old)
| "\x04" UUID
| "\x05" MD5
| "\x80" User defined
code_w_s ::= int32 string document Code w/ scope

笔记

  • Array - 数组文档是一个正常的BSON文档。keys是从0开始顺序编号的整数.例如,一个数组['red', 'blue']编码为document表示{'0': 'red', '1': 'blue'}。keys必须是升序的。

  • UTC datetime - int64是以毫秒为单位的Unix时间.

  • Timestamp - 使用 MongoDB 复制和分片的特别内部类型。前4字节是增量,后4字节时间戳.

  • Min key - 与其他可能的 BSON 元素值进行小于比较的特殊类型。

  • Max key - 与其他可能的 BSON 元素值进行大于比较的特殊类型。

  • Generic binary subtype - 这是最常用的二进制子类型,应该是默认的驱动程序和工具。

  • BSON "binary"或"BinData"的数据类型用来表示的字节数组。它是有些类似于Java的ByteArray的概念。BSON 二进制值有一种亚型。这用于指示什么样的数据是在字节数组中。从0到127的子类型是预定义或保留的。从128-255 的子类型是用户定义的。

    \x02 Binary (旧版本)-这曾经是默认的子类型,但是为了支持 \x00 被否决。驱动程序和工具应务必妥善处理 \x02。二进制数据 (byte* 中的数组的二进制非终端) 的结构必须是int32后紧接着(byte*)。Int32是重复中的字节数。

    \x03 UUID (旧版本)-这曾经是 UUID 亚型,但为了支持 \x04 被否决。驱动程序和工具的语言与本机的 UUID 类型应适当地处理 \x03。

    \x80-\xFF是用户定义的子类型。二进制数据可以是任何数据。code_w_s带一个int32范围,表示代码以字节为单位的长度。该字符串是 JavaScript 代码。该文件是从标识符映射到值,表示应在其中计算字符串的范围。

BSON 1.0版本规范(翻译)的更多相关文章

  1. Android官方技术文档翻译——迁移 Gradle 项目到1.0.0 版本

    本文译自Android官方技术文档<Migrating Gradle Projects to version 1.0.0>,原文地址:http://tools.android.com/te ...

  2. Go语言安全编码规范-翻译(分享转发)

    Go语言安全编码规范-翻译 本文翻译原文由:blood_zer0.Lingfighting完成 如果翻译的有问题:联系我(Lzero2012).匆忙翻译肯定会有很多错误,欢迎大家一起讨论Go语言安全能 ...

  3. [转]MBTiles 1.2 规范翻译

    MBTiles 1.2 可以参考超图的文档MBTiles扩展具体实现可以参考浅谈利用SQLite存储离散瓦片的思路和实现方法 mapbox提供了一个简单实现测试代码,github地址在这里https: ...

  4. Activiti工作流学习-----基于5.19.0版本(2)

    二.activiti.cfg.xml的其他bean节点配置 2.1 新特性:Job Executor和Async Executor 从5.17.0版本的activiti开始提供作业执行者(Job Ex ...

  5. 【AngularJS】 2.0 版本发布

    [AngularJS] 2.0 版本发布 w5cValidator[AngularJS] 2.0 版本发布   w5cValidator 插件基于angular原有的表单验证,在原有的基础上扩展了一些 ...

  6. w5cValidator【AngularJS】 2.0 版本发布

    w5cValidator 插件基于angular原有的表单验证,在原有的基础上扩展了一些错误提示的功能,让大家不用在每个表单上写一些提示信息的模板,专心的去实现业务逻辑. 代码地址:https://g ...

  7. Servlet2.5版本和Servlet3.0版本

    在学习这节之前你需要在你自己的电脑进行如下配置: 配置Java运行环境:JDK+JRE的安装配置,参考博客Windows下配置Java开发环境: 安装Eclipse:参考博客Windows下配置Jav ...

  8. tensorflow2.0编程规范

    背景 tensorflow2.0 相比于1.0 有很大变化,1.0版本的placeholder,Session都没有了,2.0版本强推使用keras.keras是一个比较高层的api,确实挺好用的,一 ...

  9. Apache Flink 1.9.0版本新功能介绍

    摘要:Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时,提供支持流处理和批处理两种类型应用的功能.目前,Apache Flink 1.9 ...

随机推荐

  1. nltk.download()出错解决

    http://blog.csdn.net/joey_su/article/details/17289621 官方下载地址 http://www.nltk.org/nltk_data/ 把python自 ...

  2. 基于Python实现对PDF文件的OCR识别

    http://www.jb51.net/article/89955.htm https://pythontips.com/2016/02/25/ocr-on-pdf-files-using-pytho ...

  3. Java代码块

    代码块分为普通代码块.构造块.静态代码块.同步代码块4种 普通代码块 普通代码块是指直接在方法或者是语句中定义的代码块 构造块 构造块是直接写在类中的代码块 构造块优先于构造方法执行,而且每次实例化对 ...

  4. (转)深入理解Java中的final关键字

    转自:http://www.importnew.com/7553.html Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方 ...

  5. 横竖屏切换时,Activity的生命周期

    横竖屏切换时,Activity的生命周期 1.新建一个Activity,并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate-->onStart-->onRe ...

  6. django笔记-模型数据模板呈现过程记录(多对多关系)

    首先,推荐一个网址:http://www.tuicool.com/articles/BfqYz2F,因为这里的比我的要有条理,更有利于各位的理解. 以下仅为为个人一次不完整的笔记: 环境:ubuntu ...

  7. 【好玩】将js代码转为日式表情

    直接上网址:http://utf-8.jp/public/aaencode.html?src=hello 试试将下面代码执行一下吧: ゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; ...

  8. inet_ntoa、 inet_aton、inet_addr

    inet_addr()   简述:将一个点间隔地址转换成一个in_addr. #include <winsock.h> unsigned long PASCAL FAR inet_addr ...

  9. 一次插入多条记录 [mysql]

    调用多次INSERT语句不就可以插入多条记录了吗?但使用这种方法要增加服务器的负荷,因为,执行每一次SQL服务器都要同样对SQL进行分析.优化等操作.幸好MySQL提供了另一种解决方案,就是使用一条I ...

  10. 黄学长模拟day1 某种密码

    关于某种密码有如下描述:某种密码的原文A是由N个数字组成,而密文B是一个长度为N的01数串,原文和密文的关联在于一个钥匙码KEY.若KEY=∑▒[Ai*Bi],则密文就是原文的一组合法密码. 现在有原 ...