# Binary JSON Format Specification

Format version: 1.0

This binary data format is developed for use as binary version of JSON in [VoxelEngine-Cpp](https://github.com/MihailRis/VoxelEngine-Cpp) and not compatible with [BSON](https://bsonspec.org/spec.html) due to elements/entries syntax and type codes differences

## Basic types

byteorder: little-endian
| Name    | Size    | Definition              |
| ------- | ------- | ----------------------- |
| byte    | 1 byte  | 8 bit unsigned integer  |
| int16   | 2 bytes | 16 bit signed integer   |
| int32   | 4 bytes | 32 bit signed integer   |
| int64   | 8 bytes | 64 bit unsigned integer |
| uint32  | 4 bytes | 32 bit unsigned integer |
| float64 | 8 bytes | 64 bit floating point   |

## Syntax (RFC 5234)

```bnf
file      = %x01 document / cdocument   file content
document  = uint32 (*entry) %x00        uint32 stores bytes number 
                                        of the encoded document 
                                        including the uint32 size
entry     = cstring value
value     = %x01 document
          / %x02 (*value) %x00          list of values
          / %x03 byte                   8 bit integer
          / %x04 int16                  16 bit integer
          / %x05 int32                  32 bit integer
          / %x06 int64                  64 bit integer
          / %x07 float64                number
          / %x08 string                 utf-8 encoded string
          / %x09 uint32 (*byte)         bytes array
          / %x0A                        boolean 'false'
          / %x0B                        boolean 'true'
          / %x0C                        null value
cdocument = %x1F %x8B (16*byte)         gzip-compressed data:
                                            %x01 document
cstring   = (*%x01-FF) %x00
string    = uint32 (*byte)              uint32 stores number of the 
                                        encoded string bytes

float64   = 8byte
int64     = 8byte
uint32    = 4byte
int32     = 4byte
int16     = 2byte
byte      = %x00-FF
```
