1

我正在寻找我称之为“二进制序列化器/解串器代码生成器”的东西,因为缺少一个更好的术语,专门允许您指定具有任意位长度的在线格式,然后生成必要的 C/C++以该格式打包/解包数据包的代码。我开始使用带有位字段的结构,但在阅读了这篇文章后,我想知道是否已经有一些东西可以处理所有混乱的问题。我需要处理的示例数据结构:

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 位字段)的示例,或者它是否也具有序列化方法,因为它似乎专注于单向反序列化用于入侵检测。

除了滚动另一种序列化格式之外,是否有符合我标准的 FOSS 替代方案,或者有人可以为上述结构提供使用这些参考之一的示例?

4

1 回答 1

1

您可能会为此考虑 ASN.1 并使用 PER(对齐或未对齐)。您可以使用限制为所需长度的 BIT STRING 类型,或使用带有约束的 INTEGER 类型来将值限制为您想要的位数。由于 ASN.1 及其编码规则独立于机器架构和编程语言,您不必担心您的机器是大端还是小端,或者通信的一端是否更喜欢 Java 而不是 C 或C++。一个好的 ASN.1 工具可以为您处理所有这些。您可以在ASN.1 项目页面上找到有关 ASN.1 的更多信息,该页面具有ASN.1 简介链接以及ASN.1 工具列表(一些免费一些商业)。我提到 UNALIGNED PER 的原因是,您可以根据需要准确地发送该行的位数,而无需在其间添加填充位。

对于 BIT STRINGS,您甚至可以为对您的应用程序有意义的各个位指定名称。

于 2018-06-13T16:13:41.093 回答