UBF Base
Universal Binary Format (UBF) Base
Version 1.0
Working Draft (2016-02-10)
Data Format
Value Types
Dict
"\x10"
uint8
= number of bytes{ Entry }
"\x11"
uint16
{ Entry }
"\x12"
uint32
{ Entry }
Entry
... Key
Value
Key
"\xE0"
uint8
= number of bytes{ byte }
"\xE1"
uint16
{ byte }
{ byte }
... UTF-8 encoded characters
List
"\x14"
uint8
= number of bytes{ Value }
"\x15"
uint16
{ Value }
"\x16"
uint32
{ Value }
String
"\x20"
uint8
= number of bytes{ byte }
"\x21"
uint16
{ byte }
"\x22"
uint32
{ byte }
{ byte }
... UTF-8 encoded characters
Binary
"\x24"
uint8
= number of bytes{ byte }
"\x25"
uint16
{ byte }
"\x26"
uint32
{ byte }
{ byte }
... binary data
Number
"\x30"
int8
= Int8"\x31"
int16
= Int16"\x32"
int32
= Int32"\x33"
int64
= Int64"\x38"
float
= Float"\x39"
double
= Double
Boolean
"\x40"
= False"\x41"
= True
Null
"\x42"
= Null
Markers
Reserved for Detecting JSON
\x5B
=[
... Array\x7B
={
... Object
Grammar
Terminal Symbols
byte = (* 1 byte *);
uint8 = (* 1 byte ; 8-bit unsigned integer *);
uint16 = (* 2 bytes; 16-bit unsigned integer *);
uint32 = (* 4 bytes; 32-bit unsigned integer *);
int8 = (* 1 byte ; 8-bit signed integer, two's complement *);
int16 = (* 2 bytes; 16-bit signed integer, two's complement *);
int32 = (* 4 bytes; 32-bit signed integer, two's complement *);
int64 = (* 8 bytes; 64-bit signed integer, two's complement *);
float = (* 4 bytes; 32-bit IEEE 754 floating point *);
double = (* 8 bytes; 64-bit IEEE 754 floating point *);
Byte order: big-endian
Production Rules
UBF = (* UBF ----------------------- ! *)
[ "\xFF" "\x55" "\x42" "\x00" ] (* Magic Number (optional) *)
{ Value } (* Value *)
;
Value = (* Value ----------------------- *)
BaseValue (* Value (Base) *)
;
BaseValue = (* Value ------------------ Base *)
BaseValueDict (* Dict *)
| BaseValueList (* List *)
| BaseValueString (* String *)
| BaseValueBinary (* Binary *)
| BaseValueNumber (* Number *)
| BaseValueBoolean (* Boolean *)
| BaseValueNull (* Null *)
;
BaseValueDict = (* Dict ------------------- Base *)
"\x10" uint8 { Entry } (* max 254 bytes *)
| "\x11" uint16 { Entry } (* max 65,534 bytes *)
| "\x12" uint32 { Entry } (* max 2,147,483,647 bytes *)
;
BaseValueList = (* List ------------------- Base *)
"\x14" uint8 { Value } (* max 254 bytes *)
| "\x15" uint16 { Value } (* max 65,534 bytes *)
| "\x16" uint32 { Value } (* max 2,147,483,647 bytes *)
;
BaseValueString = (* String ----------------- Base *)
"\x20" uint8 { byte } (* max 254 bytes *)
| "\x21" uint16 { byte } (* max 65,534 bytes *)
| "\x22" uint32 { byte } (* max 2,147,483,647 bytes *)
;
BaseValueBinary = (* Binary ----------------- Base *)
"\x24" uint8 { byte } (* max 254 bytes *)
| "\x25" uint16 { byte } (* max 65,534 bytes *)
| "\x26" uint32 { byte } (* max 2,147,483,647 bytes *)
;
BaseValueNumber = (* Number ----------------- Base *)
"\x30" int8 (* Int8 *)
| "\x31" int16 (* Int16 *)
| "\x32" int32 (* Int32 *)
| "\x33" int64 (* Int64 *)
| "\x38" float (* Float *)
| "\x39" double (* Double *)
;
BaseValueBoolean = (* Boolean ---------------- Base *)
"\x40" (* False *)
| "\x41" (* True *)
;
BaseValueNull = (* Null ------------------- Base *)
"\x42" (* Null *)
;
Entry = (* Entry ----------------------- *)
Key Value
;
Key = (* Key ------------------------- *)
BaseKey (* Key (Base) *)
;
BaseKey = (* Key -------------------- Base *)
"\xE0" uint8 { byte } (* max 254 bytes *)
| "\xE1" uint16 { byte } (* max 65,534 bytes *)
;
Updated less than a minute ago