有线协议序列化

时间:2018-06-12 13:06:03

标签: binary-serialization binary-deserialization

我正在寻找我称之为二进制串行器/解串器代码生成器'缺少一个更好的术语,特别允许您指定具有任意位长度的线上格式,然后生成必要的C / C ++代码以打包/解压缩该格式的数据包。我开始沿着使用带有位字段的结构的路径,但在阅读this post之后,我想知道是否已经存在处理所有混乱问题的东西。我需要处理的示例数据结构:

struct header {
    unsigned int val1 : 8;
    unsigned int val2 : 24;
    unsigned int val3 : 16
    unsigned int val4 : 2;
    unsigned int val5 : 3;
    unsigned int val6 : 1;
    unsigned int val7 : 10;
}

保持数据结构字段的动机是,它使程序员根据协议中匹配的内容更容易设置/获取字段,例如。 val5可能是一个有意义的3位标志。是的我可以为整个结构提供两个32位值,并且必须使用位掩码和东西来跟踪所有内容,但为什么呢?

我知道像Google Proto Buf之类的东西,但AFAIK这些都专注于程序员方数据结构,并且不允许您指定特定的位模式 - 想象一下尝试创建客户端低级协议的代码,其中二进制有线格式是它的指定方式。我发现的最接近的是protlr,听起来不错,除非它看起来不像是FOSS。 SO上的其他帖子指向:

  • RedBlocks似乎是一个完整的嵌入式框架的一部分。
  • PADS这似乎非常陈旧,过于复杂,无法满足我的需求。
  • binpac这听起来很有趣,但我找不到使用它来解析任意位长度(例如1位,2位,17位字段)的例子,或者它是否也有序列化方法它似乎专注于入侵检测的单向反序列化。

除了滚动yet another serialization format之外,是否有符合我标准的FOSS替代方案,或者有人可以使用这些参考中的一个为上述结构提供示例?

1 个答案:

答案 0 :(得分:1)

您可以考虑使用ASN.1并使用PER(对齐或未对齐)。您可以使用约束为所需长度的BIT STRING类型,也可以使用带约束的INTEGER类型将值限制为您想要的位数。由于ASN.1及其编码规则独立于机器架构和编程语言,因此您不必担心您的计算机是big-endian还是little-endian,或者通信的一端是否更喜欢Java而不是C或C ++。一个好的ASN.1工具可以为您处理所有这些。您可以在ASN.1 Project page处找到有关ASN.1的更多信息,其中包含Introduction to ASN.1链接以及ASN.1 Tools列表(某些免费商业广告)。我提到UNALIGNED PER的原因是你可以根据需要精确地发送该行的位数,而不需要添加填充位。

对于BIT STRINGS,您甚至可以为您的应用程序分配具有某些意义的各个位的名称。