Understanding BSON Notation
bson
Solution
{"hello": "world"}
\x16\x00\x00\x00
\x02 hello\x00 \x06\x00\x00\x00 world\x00
\x00
(overall: 22 bytes)
The first four bytes contain the overall length as a 32-bit little-endian integer.
`\x16\x00\x00\x00` => That's 22 in decimal.
Now comes the first element. The first byte gives the type of data.
`\x02` => That's a UTF-8 string.
Then comes the name of the first element, as a null-terminated string.
`hello\x00`
Next comes the data of the element in the previously given type, in this case a string. For scannability (so you can quickly skip when you don't need them), strings start with their length, and are null-terminated.
`\x06\x00\x00\x00` => That's length 6.
`world\x00`
Now would come subsequent elements, if there were any. The whole thing is terminated with a null byte.
`\x00`
{"BSON": ["awesome", 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
(overall: 49 bytes, array: 38 bytes)
The first four bytes contain the overall length as a 32-bit little-endian integer.
`\x31\x00\x00\x00` => That's 49 in decimal.
Now comes the first element. The first byte gives the type of data.
`\x04` => That's an array.
Then comes the name of the first element, as a null-terminated string.
`BSON\x00`
Next comes the data of the element in the previously given type, in this case an array.
[Quote: "The document for an array is a normal BSON document with integers for the keys, starting with 0 (..)"]
For scannability and because they form document in their own right, arrays start with their length, and are null-terminated.
`\x26\x00\x00\x00` => That's 38 in decimal.
Now comes the first element of the array. The first byte gives the type of data.
`\x02` => That's a UTF-8 string.
Then comes the name of the first element of the array, null-terminated.
`0\x00` => That's key 0.
Next comes the data of the element in the previously given type, in this case a string. Strings start with their length, and are null-terminated.
`\x08\x00\x00\x00` => length 8
`awesome\x00`
Now comes the second element of the array. The first byte gives the type of data.
`\x01` => That's a double floating point number.
Then comes the name of the second element of the array, null-terminated.
`1\x00` => That's key 1.
Next comes the data of the element in the previously given type, in this case a double floating point number.
`\x33\x33\x33\x33\x33\x33\x14\x40` => That's 5.5.
Now comes the third element of the array. The first byte gives the type of data.
`\x10` => That's a 32-bit integer.
Then comes the name of the third element of the array, null-terminated.
`2\x00` => That's key 2.
Next comes the data of the element in the previously given type, in this case a 32-bit integer.
`\xc2\x07\x00\x00` => That's 1986.
The array is terminated with a null byte.
`\x00`
The whole thing is terminated with a null byte.
`\x00`
Problem
I was trying to understand BSON Notations from the site BSON Site. However I was unable to understand the reason behind the correlations. I also referred the following questions, but am not convinced because of the following reasons. Question 1 : Not familiar with ruby implementations Question 2 : I understood the byte allocation. But unsure about the notations. I would like to know how the bson object is formed for the following examples in BSON Site 1.{"hello": "world"} 2.{"BSON": ["awesome", 5.05, 1986]}