Понимание нотации BSON

Я пытался понять обозначения BSON с сайта сайта BSON. Однако я не мог понять причину корреляций.

Я также сослался на следующие вопросы, но не убежден по следующим причинам.

Вопрос 1: не знаком с реализациями ruby

Вопрос 2: я понял распределение байтов. Но не уверен в обозначениях.

Я хотел бы знать, как формируется объект bson для следующих примеров на сайте BSON< /а>

1.{"привет": "мир"}
2.{"BSON": ["круто", 5.05, 1986]}


person data_set    schedule 02.04.2013    source источник


Ответы (1)


{"привет": "мир"}

\x16\x00\x00\x00
  \x02 hello\x00 \x06\x00\x00\x00 world\x00
\x00

(всего: 22 байта)

Первые четыре байта содержат общую длину в виде 32-битного целого числа с обратным порядком байтов.

\x16\x00\x00\x00 => Это 22 в десятичном формате.

Теперь идет первый элемент. Первый байт указывает тип данных.

\x02 => Это строка UTF-8.

Затем идет имя первого элемента в виде строки с завершающим нулем.

hello\x00

Далее идут данные элемента в ранее заданном типе, в данном случае это строка. Для удобства сканирования (чтобы вы могли быстро пропустить, когда они вам не нужны), строки начинаются с их длины и заканчиваются нулем.

\x06\x00\x00\x00 => Это длина 6.

world\x00

Теперь пошли бы последующие элементы, если бы они были. Все это завершается нулевым байтом.

\x00


{"BSON": ["круто", 5.05, 1986]}

\x31\x00\x00\x00
  \x04 BSON\x00 \x26\x00\x00\x00
                  \x02 0\x00 \x08\x00\x00\x00 awesome\x00
                  \x01 1\x00 \x33\x33\x33\x33\x33\x33\x14\x40
                  \x10 2\x00 \xc2\x07\x00\x00
                \x00
\x00

(всего: 49 байт, массив: 38 байт)

Первые четыре байта содержат общую длину в виде 32-битного целого числа с обратным порядком байтов.

\x31\x00\x00\x00 => Это 49 в десятичной системе.

Теперь идет первый элемент. Первый байт указывает тип данных.

\x04 => Это массив.

Затем идет имя первого элемента в виде строки с завершающим нулем.

BSON\x00

Далее идут данные элемента ранее заданного типа, в данном случае это массив.

[Цитата: "Документ для массива — это обычный документ BSON с целыми числами в качестве ключей, начиная с 0 (..)"]

Для удобства сканирования и поскольку они сами по себе формируют документ, массивы начинаются со своей длины и заканчиваются нулем.

\x26\x00\x00\x00 => Это 38 в десятичном формате.

Теперь идет первый элемент массива. Первый байт указывает тип данных.

\x02 => Это строка UTF-8.

Затем идет имя первого элемента массива, оканчивающегося нулем.

0\x00 => Это ключ 0.

Далее идут данные элемента в ранее заданном типе, в данном случае это строка. Строки начинаются с их длины и заканчиваются нулем.

\x08\x00\x00\x00 => длина 8

awesome\x00

Теперь идет второй элемент массива. Первый байт указывает тип данных.

\x01 => Это двойное число с плавающей запятой.

Затем идет имя второго элемента массива, оканчивающегося нулем.

1\x00 => Это ключ 1.

Далее идут данные элемента в ранее заданном типе, в данном случае двойное число с плавающей запятой.

\x33\x33\x33\x33\x33\x33\x14\x40 => Это 5,5.

Теперь идет третий элемент массива. Первый байт указывает тип данных.

\x10 => Это 32-битное целое число.

Затем идет имя третьего элемента массива, оканчивающегося нулем.

2\x00 => Это ключ 2.

Далее идут данные элемента в ранее заданном типе, в данном случае 32-битное целое число.

\xc2\x07\x00\x00 => Это 1986 год.

Массив завершается нулевым байтом.

\x00

Все это завершается нулевым байтом.

\x00

person Nicolas Kaiser    schedule 11.05.2013
comment
Спасибо, @NicolasKaiser. Что касается символов с прямым порядком байтов, betterexplained.com /статьи/ - person data_set; 24.05.2013
comment
Можете объяснить \xc2\x07\x00\x00 =› Это 1986 год? - person PlsWork; 10.11.2019