0.1.0 • Published 2 years ago

bipf-spec v0.1.0

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

BIPF spec

Specification for BIPF (Binary In-Place Format). A binary format designed for in-place (without parsing) reads, with schemaless json-like semantics.

Format

Data are type-length-value (TLV) encoded in BIPF. The type and length are packed into a varint called tag. The type is stored in the lowest 3 bits, and the length the higher bits.

Since a varint can store values up to 128 bits in a single byte, values less than 16 bytes long have a one byte tag, and values up to 8k long have a two byte tag, values up to 1048576 bytes have a 3 byte tag, and so on. See varints in protobuf for more information.

<tag: varint(encoding_length(value) << 3 | type)><value>

The type indicates the encoding of the value.

Valid types are:

STRING  : 0 (000) // utf8 encoded string
BUFFER  : 1 (001) // raw binary buffer
INT     : 2 (010) // little endian 32 bit integer
DOUBLE  : 3 (011) // little endian 64 bit float
ARRAY   : 4 (100) // sequence of any other value
OBJECT  : 5 (101) // sequence of alternating bipf encoded key and value
BOOLNULL: 6 (110) // 1 = true, 0 = false, no value means null
EXTENDED: 7 (111) // custom type. Specific type should be indicated by varint at start of buffer

Fixtures

This repo contains a fixtures.json with different examples. The json and binary (bipf) values are hex encoded buffers.

Motivation

For a detailed motivation, please refer to: https://github.com/ssbc/bipf#motivation.

Implementations