Binn - это формат сериализации двоичных данных, разработанный для того, чтобы быть компактным, быстрым и простым в использовании.
Элементы хранятся с указанием их размеров для увеличения производительности чтения.
Библиотека использует zero-copy при чтении строк, блобов и контейнеров.
Строки завершаются нулевым символом, поэтому при чтении библиотека возвращает указатель на них внутри буфера, избегая выделения памяти и копирования данных.
Формат Binn поддерживает все это:
Примитивные типы данных:
- null
- boolean (
true
иfalse
) - целые числа (до 64 бит, знаковые или беззнаковые)
- числа с плавающей точкой (IEEE одинарной и двойной точности)
- строка
- блоб (двоичные данные)
- определенные пользователем
Контейнеры:
- список
- карта (ассоциативный массив с числовым ключом)
- объект (ассоциативный массив с текстовым ключом)
Элементы хранятся следующим образом:
boolean, null: [type] int, float (хранение: byte, word, dword или qword): [type][data] string, blob: [type][size][data] list, object, map: [type][size][count][data]
Данные json, такие как {"hello":"world"}, сериализуются в binn следующим образом:
\xE2 // тип = объект (контейнер) \x11 // общий размер контейнера \x01 // количество пар ключ/значение \x05hello // ключ \xA0 // тип = строка \x05world\x00 // значение (завершается нулевым символом)
Вы можете ознакомиться с полной спецификацией
Запись
binn *obj;
// создание нового объекта
obj = binn_object();
// добавление значений к нему
binn_object_set_int32(obj, "id", 123);
binn_object_set_str(obj, "name", "John");
binn_object_set_double(obj, "total", 2.55);
// отправка по сети или сохранение в файл...
send(sock, binn_ptr(obj), binn_size(obj));
// освобождение буфера
binn_free(obj);
Чтение
int id;
char *name;
double total;
id = binn_object_int32(obj, "id");
name = binn_object_str(obj, "name");
total = binn_object_double(obj, "total");
Вы можете найти больше примеров использования здесь и в папке с примерами
- Javascript: liteserver/binn.js
- PHP: et-nik/binn-php
- PHP: JaredClemence/binn
- Python: meeron/pybinn
- Elixir: thanos/binn
- Erlang: tonywallace64/erl_binn (частичная реализация)
- F#: meeron/FSBinn
- Rust: Binn IR
- Go: et-nik/binngo
Не стесняйтесь делать обертку для вашего предпочтительного языка. Затем сообщите нам, чтобы мы могли указать его здесь.
- Включая файл binn.c в ваш проект; или
- Включая статическую библиотеку в ваш проект; или
- Связывание с библиотекой binn:
gcc myapp.c -lbinn
Включите binn-3.0.lib
в ваш проект MSVC или используйте MinGW:
gcc myapp.c -lbinn-3.0
git clone https://github.com/liteserver/binn
cd binn
make
sudo make install
Он создаст файл libbinn.so.3.0
на Linux и libbinn.3.dylib
на MacOSX
Используйте включенный проект Visual Studio в папке src/win32 или скомпилируйте его с помощью MinGW:
git clone https://github.com/liteserver/binn
cd binn
make
Оба создадут файл binn-3.0.dll
Для создания статической библиотеки:
make static
Он создаст файл libbinn.a
Проверьте наличие предварительно скомпилированных бинарных файлов в проекте android-binn-native
cd binn
make test
Используйте включенный проект в папке test/win32
Текущая версия (3.0) стабильна и готова к использованию в производстве
Так как она кросс-платформенная, данные могут передаваться между устройствами с little-endian и big-endian
Apache 2.0
Вопросы, предложения, поддержка: contact AT litereplica DOT io