bdspack v0.9.1
BDSP (Binary Document Serializable Pack)
A library to serialize document data into binary format.
(中文文档)docs/readme_CN.md
- BDSP (Binary Document Serializable Pack)
Structure
As the name of the library, we keep the structure in key-value pairs just like JSON format.
And what's more, we support Byte Array - RAW binary data fragment.
Example:
{
"id": 13,
"formats": ["xml", "json"],
"title": "test",
"meta":
{
"isFile": true,
"size": 6.43,
"payload": new Uint8Array([0x01, 0x02, 0x03]),
"tag": undefined
}
}Would be serialized as:
0 1 2 3 4 5 6 7 8 9 A B C D E F
===========================================================
00000010 | 44 61 14 02 69 64 04 03 14 07 66 6F 72 6D 61 74
00000020 | 73 14 0D 14 0B 14 03 78 6D 6C 14 04 6A 73 6F 6E
00000030 | 14 05 74 69 74 6C 65 14 04 74 65 73 74 14 04 6D
00000040 | 65 74 61 14 2E 04 2C 14 06 69 73 46 69 6C 65 01
00000050 | 14 04 73 69 7A 65 03 B8 1E 85 EB 51 B8 19 40 14
00000060 | 07 70 61 79 6C 6F 61 64 14 03 01 02 03 14 03 74
00000070 | 61 67 FFWith each data block, they are built up with:
| Magic | Size | Payload |
|---|---|---|
| 0D | 03 | 61 62 63 |
- Only
String,Binary,Documenttypes needSizepart. BooleanandUndefinedtypes only containsMagicpart.
Data types
All data types would use LITTLE ENDIAN to convert to binary.
Undefined
When the data value is undefined or null, this data would be identified as Undefined type.
The Magic part is always 0xFF and no Size part and Payload part.
Boolean
Boolean only has two types of value, true or false.
This data type do not have Size part and Payload part.
Magic: 0x00 | False
When the Magic is 0x00, this data would be identified as Boolean type.
And also, its value would be false.
Example:
00 - falseMagic: 0x01 | True
When the Magic is 0x01, this data would be identified as Boolean type.
And also, its value would be true.
Example:
01 - trueDecimal
Decimal is the number with fractional part. So, it is not an integer.
The value would be converted to Payload part following IEEE 754 standard.
This type do not have Size part.
Magic: 0x02 | Single
0x02 = 0x02 | 0x00
0x02 => Flags.Decimal, 0x00 => Flags.Single
Example:
02 3E 1C 40 00 - 0.152587890625Magic: 0x03 | Double
0x03 = 0x02 | 0x01
0x02 => Flags.Decimal, 0x00 => Flags.Double
Example:
03 3F CD CD 65 00 00 00 00 - 0.23283064365386962890625Integer
There are 8 types of Integer in total.
(signed/unsigned) (8/16/32/64) bit integer.
You do not need to concern which type to use.
Because the library would find out the best type of these to use.
Magic: 0x04 | Unsigned 8-bytes Int
0x04 = 0x04 | 0x00 | 0x00
0x04 => Flags.Integer, 0x00 => Flags.Int8, 0x00 => Flags.Unsigned
Example:
04 7F - 127Magic: 0x05 | Unsigned 16-bytes Int
0x05 = 0x04 | 0x01 | 0x00
0x04 => Flags.Integer, 0x01 => Flags.Int16, 0x00 => Flags.Unsigned
Example:
05 FF FF - 65535Magic: 0x06 | Unsigned 32-bytes Int
0x06 = 0x04 | 0x03 | 0x00
0x04 => Flags.Integer, 0x02 => Flags.Int32, 0x00 => Flags.Unsigned
Example:
06 2A B5 40 88 - 716521608Magic: 0x07 | Unsigned 64-bytes Int
0x07 = 0x04 | 0x03 | 0x00
0x04 => Flags.Integer, 0x03 => Flags.Int64, 0x00 => Flags.Unsigned
Example:
07 00 0B 29 43 0A 24 D0 E6 - 3141592653549798Magic: 0x84 | Signed 8-bytes Int
0x84 = 0x04 | 0x00 | 0x80
0x04 => Flags.Integer, 0x00 => Flags.Int8, 0x80 => Flags.Signed
Example:
84 FF - -1Magic: 0x85 | Signed 16-bytes Int
0x85 = 0x04 | 0x01 | 0x80
0x04 => Flags.Integer, 0x01 => Flags.Int16, 0x80 => Flags.Signed
Example:
85 FF FF - -1Magic: 0x86 | Signed 32-bytes Int
0x06 = 0x04 | 0x03 | 0x00
0x04 => Flags.Integer, 0x02 => Flags.Int32, 0x80 => Flags.Signed
Example:
86 FF FF FF FF - -1Magic: 0x87 | Signed 64-bytes Int
0x07 = 0x04 | 0x03 | 0x00
0x04 => Flags.Integer, 0x03 => Flags.Int64, 0x80 => Flags.Signed
Example:
87 FF FF FF FF FF FF FF FF - -1String
The Magic of String type is built up with Data Type Magic and Size Integer Type Magic.
In another words: Magic = Flags.String (0x0c) | Flags.Integer | Flags.Unsigned | <int type>。
Size Integer Type Magic could be Uint8, Uint16 and Uint32.
That is the type of Size.
For this reason, we support the max size(bytes size) of the String is 4294967295.
And the String would use UTF-8 encoding.
Example:
0D 03 61 62 63 - abcBinary
This type used for encode the RAW binary data.
The Magic of Binary type is built up with Data Type Magic and Size Integer Type Magic.
In another words: Magic = Flags.Binary (0x10) | Flags.Integer | Flags.Unsigned | <int type>。
That is the type of Size.
For this reason, we support the max size(bytes size) of the Binary is 4294967295.
And the Binary would use UTF-8 encoding.
示例:
14 04 01 02 03 04 - [0x01, 0x02, 0x03, 0x04]Document
The stucture would be the same with Binary type.
The binary data in Payload part could be unpack to a BDSP document.
The Magic of Binary type is built up with Data Type Magic and Size Integer Type Magic.
In another words: Magic = Flags.Document (0x20) | <document type> | Flags.Integer | Flags.Unsigned | <int type>
That is the type of Size.
For this reason, we support the max size(bytes size) of the Document is 4294967295.
And the Document would use UTF-8 encoding.
<document type> could be:
Flags.List (0x10) - each properties do not have Property Name.
Flags.Dictionary (0x00) key-value type.
Example:
34 05 <bytes of doc body><bytes of doc body> only contains the Body part of the document. Magic and Size is not includes.
Because it is duplicated with the Magic part and Size part for the property defination.
EXTEND - DateTime
DateTime is one of the extend type. It is actually a integer type.
The value would be the total milliseconds from the 1970/01/01 0:00:00 Z to the specified datetime in UTC timezone.
Then the total milliseconds stored as an Integer type.
The structure of the package
| Version + Doctype + Size Integer Type Magic | Data Size | Data Body |
|---|---|---|
| 0D | 03 | 61 62 63 |
Magic = Flags.Root (0x40) | Flags.List/Flags.Dictionary | Flags.Integer | Flags.Uint8/16/32
Body
When the document is Dictionary type, the body would be
prop1.key + prop1.value + prop2.key + prop2.value ....
The key is always String type.
When the document is List type, the body would be
prop1.value + prop2.value + ....
Flags
ROOT: 0x40
BOOLEAN: 0x00
FALSE: 0x00
TRUE: 0x01
DECIMAL: 0x02
SINGLE: 0x00
DOUBLE: 0x01
INTEGER: 0x04
INT8: 0x00
INT16: 0x01
INT32: 0x02
INT64: 0x03
SIGNED: 0x80
UNSIGNED: 0x00
INTMASK: 0x03
STRING: 0x08
BINARY: 0x10
DOCUMENT: 0x20
DICTIONARY: 0x00
LIST: 0x10
EXTENDABLE_MASK: 0x44
EXTEND_DATETIME: 0x10
UNDEFINED: 0xFFMagic in all
Magic (Binary) | Magic (Hex) | Type
0b 0000 0000 | 0x 00 | boolean(false)
0b 0000 0001 | 0x 01 | boolean(true)
0b 0000 0010 | 0x 02 | decimal(single)
0b 0000 0011 | 0x 03 | decimal(double)
0b 0000 0100 | 0x 04 | integer(8bit,unsigned)
0b 0000 0101 | 0x 05 | integer(16bit,unsigned)
0b 0000 0110 | 0x 06 | integer(32bit,unsigned)
0b 0000 0111 | 0x 07 | integer(64bit,unsigned)
0b 1000 0100 | 0x 84 | integer(8bit,signed)
0b 1000 0101 | 0x 85 | integer(16bit,signed)
0b 1000 0110 | 0x 86 | integer(32bit,signed)
0b 1000 0111 | 0x 87 | integer(64bit,signed)
0b 0000 1000 | 0x 08 | string flag
0b 0000 1100 | 0x 0c | string with uint8 length
0b 0000 1101 | 0x 0d | string with uint16 length
0b 0000 1110 | 0x 0e | string with uint32 length
0b 0001 0000 | 0x 10 | binary flag
0b 0001 0100 | 0x 14 | binary with uint8 length
0b 0001 0101 | 0x 15 | binary with uint16 length
0b 0001 0110 | 0x 16 | binary with uint32 length
0b 0010 0000 | 0x 20 | document(type:dict) flag
0b 0010 0100 | 0x 24 | document(type:dict) with uint8 length
0b 0010 0101 | 0x 25 | document(type:dict) with uint16 length
0b 0010 0110 | 0x 26 | document(type:dict) with uint32 length
0b 0011 0000 | 0x 30 | document(type:list) flag
0b 0011 0100 | 0x 34 | document(type:list) with uint8 length
0b 0011 0101 | 0x 35 | document(type:list) with uint16 length
0b 0011 0110 | 0x 36 | document(type:list) with uint32 length
0b 0100 0000 | 0x 40 | root document flag
0b 0100 0100 | 0x 44 | root document with uint8 length
0b 0100 0101 | 0x 45 | root document with uint16 length
0b 0100 0110 | 0x 46 | root document with uint32 length
0b 1000 1000 | 0x 44 | extendable zone
0b 1xxx 1iii | | x -> type id, i -> uint(i) length
0b 1001 1100 | 0x 9c | datetime with uint8 timestamp
0b 1001 1100 | 0x 9d | datetime with uint16 timestamp
0b 1001 1100 | 0x 9e | datetime with uint32 timestamp
0b 1111 1111 | 0x FF | undefined