便携式C二进制序列化原语

Pot*_*ter 10 c portability binaryfiles endianness htonl

据我所知,C库没有帮助将数值序列化为非文本字节流.如我错了请纠正我.

最常用的标准工具是htonlPOSIX等.这些功能有缺点:

  • 没有64位支持.
  • 没有浮点支持.
  • 签名类型没有版本.反序列化时,无符号到符号的转换依赖于有符号整数溢出,即UB.
  • 它们的名称没有说明数据类型的大小.
  • 它们依赖于8位字节和精确大小的uint_ N _t的存在.
  • 输入类型与输出类型相同,而不是引用字节流.
    • 这要求用户执行指针类型转换,这可能在对齐时不安全.
    • 执行该类型转换后,用户可能会尝试在其本机内存布局中转换和输出结构,这种做法很糟糕,导致意外错误.

用于将任意大小序列化为char8位标准字节的接口将落在C标准之间,该标准不真正确认8位字节,并且无论标准(ITU?)将八位位组设置为基本传输单位.但旧的标准没有得到修订.

现在C11有许多可选组件,可以添加二进制序列化扩展以及线程之类的东西,而不需要对现有实现提出要求.

这样的扩展是否有用,或者担心非二进制补充机器是否毫无意义?

Tim*_*nes 6

我从未使用它们,但我认为Google的Protocol Buffers满足您的要求.

  • 64位类型,符号/无符号,和浮点类型的所有支持.
  • 生成的API是类型安全的
  • 可以对流进行序列化

本教程似乎是一个非常好的介绍,你可以在这里阅读有关实际的二进制存储格式.


从他们的网页:

什么是协议缓冲?

协议缓冲区是Google的语言中立,平台中立,可扩展的机制,用于序列化结构化数据 - 思考XML,但更小,更快,更简单.您可以定义数据的结构化时间,然后可以使用特殊生成的源代码轻松地在各种数据流中使用各种语言(Java,C++或Python)编写和读取结构化数据.

纯C(仅限C++)中没有正式实现,但有两个C端口可能满足您的需求:

我不知道它们是否存在非8位字节,但它应该相对容易找到.