二进制序列化C函数库-Binn


Binn是一种二进制数据序列化格式,设计目的是使其紧凑,快速且易于使用。在现代软件开发中,数据的序列化和反序列化是一项关键任务。binn 作为一种二进制序列化格式,以其紧凑、快速和易于使用的特点脱颖而出,采用 ApacheV2.0 许可协议。
特性
元素存储时附带其大小,以提高读取性能。
在读取字符串、二进制大对象和容器时,库使用零拷贝。
字符串以空字符结尾,因此在读取时,库会返回指向缓冲区内部的指针,避免内存分配和数据复制。
数据类型
Binn格式支持以下所有类型:
基本数据类型:
空值
布尔值(true 和 false)
整数(最多64位有符号或无符号)
浮点数(IEEE单精度和双精度)
字符串
二进制大对象(二进制数据)
用户自定义
容器:
列表
映射(数字键关联数组)
对象(文本键关联数组)
binn 的紧凑性使其在存储和传输数据时能够节省大量空间。这对于资源受限的环境或需要高效数据传输的场景非常重要。同时它的快速性能确保了数据的序列化和反序列化过程能够高效进行,减少了处理时间。
格式
元素以以下方式存储:
布尔值,空值:
[类型]
整数,浮点数(存储:字节,字,双字或四字):
[类型][数据]
字符串,二进制大对象:
[类型][大小][数据]
列表,对象,映射:
[类型][大小][计数][数据]
易于使用是 binn 的另一个显著优势。它提供了简单直观的 API,使得开发者可以轻松地将数据转换为二进制格式或从二进制格式恢复数据。无论是处理简单的数据结构还是复杂的对象层次,binn 都能提供便捷的解决方案。
示例
#include <stdio.h>
#include "binn.h"
int main() {
// 创建一个新对象
binn *b = binn_new();
// 添加数据
binn_add_int32(b, "age", 30);
binn_add_string(b, "name", "Alice");
// 序列化为字节数组
uint8_t *buffer;
size_t size = binn_size(b);
buffer = (uint8_t *)malloc(size);
binn_copy(b, buffer, &size);
// 打印序列化数据
printf("Serialized size: %zu\n", size);
// 反序列化
binn *b2 = binn_new_from_buffer(buffer, size);
printf("Name: %s, Age: %d\n", binn_get_string(b2, "name"), binn_get_int32(b2, "age"));
// 清理
binn_free(b);
binn_free(b2);
free(buffer);
return 0;
}
为了满足更复杂的需求,可以适当增加代码来扩展 binn 的功能。例如可以添加对特定数据类型的支持,或者优化序列化和反序列化算法以提高性能。还可以结合其他库和工具,实现更强大的数据处理功能。
在实际应用中,binn 可以用于各种场景,如网络通信、数据存储、缓存等。它的高效性和易用性使得它在众多项目中得到了广泛应用。
binn 是一种优秀的二进制序列化格式,为开发者提供了紧凑、快速和易于使用的解决方案。通过适当增加代码进行扩展,我们可以根据具体需求定制它的功能,为数据处理任务带来更高的效率和便利性。
最新版本:3.0
于2020年12月中旬发布。
项目主页:https://github.com/liteserver/binn
特性
元素存储时附带其大小,以提高读取性能。
在读取字符串、二进制大对象和容器时,库使用零拷贝。
字符串以空字符结尾,因此在读取时,库会返回指向缓冲区内部的指针,避免内存分配和数据复制。
数据类型
Binn格式支持以下所有类型:
基本数据类型:
空值
布尔值(true 和 false)
整数(最多64位有符号或无符号)
浮点数(IEEE单精度和双精度)
字符串
二进制大对象(二进制数据)
用户自定义
容器:
列表
映射(数字键关联数组)
对象(文本键关联数组)
binn 的紧凑性使其在存储和传输数据时能够节省大量空间。这对于资源受限的环境或需要高效数据传输的场景非常重要。同时它的快速性能确保了数据的序列化和反序列化过程能够高效进行,减少了处理时间。
格式
元素以以下方式存储:
布尔值,空值:
[类型]
整数,浮点数(存储:字节,字,双字或四字):
[类型][数据]
字符串,二进制大对象:
[类型][大小][数据]
列表,对象,映射:
[类型][大小][计数][数据]
易于使用是 binn 的另一个显著优势。它提供了简单直观的 API,使得开发者可以轻松地将数据转换为二进制格式或从二进制格式恢复数据。无论是处理简单的数据结构还是复杂的对象层次,binn 都能提供便捷的解决方案。
示例
#include <stdio.h>
#include "binn.h"
int main() {
// 创建一个新对象
binn *b = binn_new();
// 添加数据
binn_add_int32(b, "age", 30);
binn_add_string(b, "name", "Alice");
// 序列化为字节数组
uint8_t *buffer;
size_t size = binn_size(b);
buffer = (uint8_t *)malloc(size);
binn_copy(b, buffer, &size);
// 打印序列化数据
printf("Serialized size: %zu\n", size);
// 反序列化
binn *b2 = binn_new_from_buffer(buffer, size);
printf("Name: %s, Age: %d\n", binn_get_string(b2, "name"), binn_get_int32(b2, "age"));
// 清理
binn_free(b);
binn_free(b2);
free(buffer);
return 0;
}
为了满足更复杂的需求,可以适当增加代码来扩展 binn 的功能。例如可以添加对特定数据类型的支持,或者优化序列化和反序列化算法以提高性能。还可以结合其他库和工具,实现更强大的数据处理功能。
在实际应用中,binn 可以用于各种场景,如网络通信、数据存储、缓存等。它的高效性和易用性使得它在众多项目中得到了广泛应用。
binn 是一种优秀的二进制序列化格式,为开发者提供了紧凑、快速和易于使用的解决方案。通过适当增加代码进行扩展,我们可以根据具体需求定制它的功能,为数据处理任务带来更高的效率和便利性。
最新版本:3.0
于2020年12月中旬发布。
项目主页:https://github.com/liteserver/binn