有线协议序列化
Wire Protocol Serialization
我正在寻找我称之为 'binary serializer/deserializer code generator' 的东西,因为缺少更好的术语专门允许您指定 on-the-wire 格式具有任意位长度,然后为该格式的 pack/unpack 数据包生成必要的 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;
}
保持这样的数据结构字段的动机是,它使程序员的工作更容易set/get基于它们在协议中匹配的字段,例如。 val5 可能是一个有意义的 3 位标志。是的,我可以为整个结构设置两个 32 位值,并且必须使用位掩码和其他东西来跟踪所有内容,但为什么呢?
我知道 Google Proto Buf 之类的东西,但是据我所知,这些都集中在程序员端的数据结构上,不允许您指定特定的位模式 - 想象一下尝试创建低级协议的客户端代码,其中二进制有线格式是如何指定的。我发现的最接近的东西是 protlr,这听起来不错,但它似乎不是 FOSS。 SO 上的其他帖子指向:
- RedBlocks 这似乎是一个完整的嵌入式框架的一部分。
- PADS 这对我的需要来说似乎非常陈旧和过于复杂。
- binpac 这听起来很有趣,但我找不到使用它来解析任意位长度(例如 1 位、2 位、17 位字段)的示例,或者如果它也有序列化方法,因为它似乎专注于入侵检测的一种反序列化方式。
除了滚动 yet another serialization format 之外,是否有满足我标准的 FOSS 替代方案,或者有人可以提供一个使用上述结构的这些参考之一的示例吗?
为此您可以考虑使用 ASN.1 并使用 PER(对齐或未对齐)。您可以使用限制为所需长度的 BIT STRING 类型,或使用具有限制的 INTEGER 类型来将值限制为您想要的位数。由于 ASN.1 及其编码规则独立于机器体系结构和编程语言,因此您不必担心您的机器是大端还是小端,或者通信的一端是否更喜欢 Java而不是 C 或 C++。一个好的 ASN.1 工具可以为您处理所有这些。您可以在 ASN.1 Project page which has a link Introduction to ASN.1 as well as a list of ASN.1 Tools 找到更多关于 ASN.1 的信息(有些是免费的,有些是商业的)。我提到 UNALIGNED PER 的原因是您可以根据需要在该行上准确发送位数,而不会在其间添加填充位。
对于 BIT STRINGS,您甚至可以为对您的应用程序有意义的各个位分配名称。
我正在寻找我称之为 'binary serializer/deserializer code generator' 的东西,因为缺少更好的术语专门允许您指定 on-the-wire 格式具有任意位长度,然后为该格式的 pack/unpack 数据包生成必要的 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;
}
保持这样的数据结构字段的动机是,它使程序员的工作更容易set/get基于它们在协议中匹配的字段,例如。 val5 可能是一个有意义的 3 位标志。是的,我可以为整个结构设置两个 32 位值,并且必须使用位掩码和其他东西来跟踪所有内容,但为什么呢?
我知道 Google Proto Buf 之类的东西,但是据我所知,这些都集中在程序员端的数据结构上,不允许您指定特定的位模式 - 想象一下尝试创建低级协议的客户端代码,其中二进制有线格式是如何指定的。我发现的最接近的东西是 protlr,这听起来不错,但它似乎不是 FOSS。 SO 上的其他帖子指向:
- RedBlocks 这似乎是一个完整的嵌入式框架的一部分。
- PADS 这对我的需要来说似乎非常陈旧和过于复杂。
- binpac 这听起来很有趣,但我找不到使用它来解析任意位长度(例如 1 位、2 位、17 位字段)的示例,或者如果它也有序列化方法,因为它似乎专注于入侵检测的一种反序列化方式。
除了滚动 yet another serialization format 之外,是否有满足我标准的 FOSS 替代方案,或者有人可以提供一个使用上述结构的这些参考之一的示例吗?
为此您可以考虑使用 ASN.1 并使用 PER(对齐或未对齐)。您可以使用限制为所需长度的 BIT STRING 类型,或使用具有限制的 INTEGER 类型来将值限制为您想要的位数。由于 ASN.1 及其编码规则独立于机器体系结构和编程语言,因此您不必担心您的机器是大端还是小端,或者通信的一端是否更喜欢 Java而不是 C 或 C++。一个好的 ASN.1 工具可以为您处理所有这些。您可以在 ASN.1 Project page which has a link Introduction to ASN.1 as well as a list of ASN.1 Tools 找到更多关于 ASN.1 的信息(有些是免费的,有些是商业的)。我提到 UNALIGNED PER 的原因是您可以根据需要在该行上准确发送位数,而不会在其间添加填充位。
对于 BIT STRINGS,您甚至可以为对您的应用程序有意义的各个位分配名称。