BDP (Binary Data Package) is a basic 64 bit packaging format for binary data.
This is a cross-platform C++17 implementation of BDP.
BDP packages store name-value pairs, where the name and the value contain binary data.
The maximum size of the names and values is determined by the package header.
BDP is a 64 bit format (i.e. the maximum possible size of a name/value is 2^64 - 1).
However, package names and values can be stored with an 8, 16, 32 or 64 bit format.
The name/value bit size is specified in the package header.
The most common BDP package type is BDP832 (meaning 8 bits for the name length & 32 bits for the value length).
This is the ABNF notation for BDP832 (see below package types).
BDP = Magic Header *Entry
Magic = %s"BDP"
Header = %x14 ; depends on the package type
Entry = NameEntry ValueEntry
NameEntry = NameLength Name
ValueEntry = ValueLength Value
NameLength = 1(%x00-FF) ; 1, 2, 4 or 8, depending on the name byte size
Name = *(%x00-FF)
ValueLength = 4(%x00-FF) ; 1, 2, 4 or 8, depending on the value byte size
Value = *(%x00-FF)For other BDP package types, the Header, NameLength and ValueLength rules vary.
This repository contains ABNF notations for every package type here.
All BDP packages begin with the magic value BDP. If this value is missing, the package is marked as invalid.
The magic value is 24 bits (3 bytes) long.
The header is stored after the magic value, and it is 8 bits (1 byte) long. It contains the name and value bit sizes.
The first 4 bits from right to left determine the value bit size, and the last 4 bits determine the name bit size. Each 4-bit group contains exactly 1 bit equal to 1.
The bit size is determined based on the position of the bit which is equal to 1, as follows:
- Position 0: 8 bit (max 255)
- Position 1: 16 bit (max 65 535)
- Position 2: 32 bit (max 4 294 967 295)
- Position 3: 64 bit (max 18 446 744 073 709 551 615)
Depending on the bit sizes, BDP packages can be classified into 16 types, with the rule BDP[NBS][VBS], where:
- [NBS] = name bit size
- [VBS] = value bit size
| Package Type | Name Bit Size | Value Bit Size | Header | ABNF Header Rule |
|---|---|---|---|---|
| BDP88 | 8 | 8 | 00010001 | %x11 |
| BDP816 | 8 | 16 | 00010010 | %x12 |
| BDP832 | 8 | 32 | 00010100 | %x14 |
| BDP864 | 8 | 64 | 00011000 | %x18 |
| BDP168 | 16 | 8 | 00100001 | %x21 |
| BDP1616 | 16 | 16 | 00100010 | %x22 |
| BDP1632 | 16 | 32 | 00100100 | %x24 |
| BDP1664 | 16 | 64 | 00101000 | %x28 |
| BDP328 | 32 | 8 | 01000001 | %x41 |
| BDP3216 | 32 | 16 | 01000010 | %x42 |
| BDP3232 | 32 | 32 | 01000100 | %x44 |
| BDP3264 | 32 | 64 | 01001000 | %x48 |
| BDP648 | 64 | 8 | 10000001 | %x81 |
| BDP6416 | 64 | 16 | 10000010 | %x82 |
| BDP6432 | 64 | 32 | 10000100 | %x84 |
| BDP6464 | 64 | 64 | 10001000 | %x88 |
The name-value pairs are stored after the header, or after the previous pair, as follows:
[name_bytes_length][name_bytes][value_bytes_length][value_bytes]
The length of the name/value is stored in exactly bitSize / 8 bytes (e.g. if the name bit size is 16, the length of the name will be stored in exactly 2 bytes, even if 1 byte is enough).
Therefore, the maximum length of a single name/value is 2^bitSize - 1.
This is an arbitrary BDP832 package which contains information about a user (2 name-value pairs):
- The full name of the user
- The avatar of the user (16x16 PNG)
Name Bit Size: 8
Value Bit Size: 32
The code documentation for this implementation can be found here.
Note: versions with the suffix R are considered stable releases, while those with the suffix D are considered unstable.
v0.1.0D - May 2nd, 2020
The BDP format was created by UnexomWid. This format, along with this C++ implementation, is licensed under the MIT license.