Binn是一种二进制数据序列化格式,设计目的是使其紧凑,快速且易于使用。
元素存储时附带其大小,以提高读取性能。
在读取字符串、二进制大对象和容器时,库使用零拷贝。
字符串以空字符结尾,因此在读取时,库会返回指向缓冲区内部的指针,避免内存分配和数据复制。
Binn格式支持以下所有类型:
基本数据类型:
- 空值
- 布尔值(
true
和false
) - 整数(最多64位有符号或无符号)
- 浮点数(IEEE单精度和双精度)
- 字符串
- 二进制大对象(二进制数据)
- 用户自定义
容器:
- 列表
- 映射(数字键关联数组)
- 对象(文本键关联数组)
元素以以下方式存储:
布尔值,空值: [类型] 整数,浮点数(存储:字节,字,双字或四字): [类型][数据] 字符串,二进制大对象: [类型][大小][数据] 列表,对象,映射: [类型][大小][计数][数据]
一个类似于{"hello":"world"}的json数据在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
它将在Linux上创建文件libbinn.so.3.0
,在MacOSX上创建文件libbinn.3.dylib
使用src/win32文件夹中的包含的Visual Studio项目或使用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)稳定且可用于生产环境
由于它是跨平台的,因此可以在小端和大端设备之间传输数据
Apache 2.0
问题,建议,支持:contact AT litereplica DOT io