Binary serialization 有线协议序列化

Binary serialization 有线协议序列化,binary-serialization,binary-deserialization,Binary Serialization,Binary Deserialization,我正在寻找我称之为“二进制序列化器/反序列化器代码生成器”的东西,因为没有更好的术语专门允许您指定具有任意位长度的在线格式,然后生成必要的C/C++代码以该格式打包/解包数据包。我开始使用带有位字段的结构,但读完后,我想知道是否已经有什么东西可以处理所有的混乱问题。我需要处理的一个示例数据结构: struct header { unsigned int val1 : 8; unsigned int val2 : 24; unsigned int val3 : 16

我正在寻找我称之为“二进制序列化器/反序列化器代码生成器”的东西,因为没有更好的术语专门允许您指定具有任意位长度的在线格式,然后生成必要的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这些都集中在程序员端的数据结构上,不允许您指定特定的位模式——想象一下尝试为低级别协议创建客户端代码,其中二进制线格式是如何指定的。我发现的最接近的东西是,除了看起来不是自由和开放源码软件外,哪个听起来很棒。关于SO的其他帖子指向:

这似乎是一个成熟的嵌入式框架的一部分。 对于我的需求来说,这似乎非常陈旧和复杂。 这听起来很有趣,但我找不到使用它解析任意位长度(例如1位、2位、17位字段)的示例,或者它是否还有序列化方法,因为它似乎专注于入侵检测的单向反序列化。

除了滚动之外,是否有符合OFS标准的OFS替代方案,或者是否有人提供了一个使用上述结构中的一个引用的例子?

< P>您可以考虑ASN 1,并使用每一个对齐或不对齐。您可以使用受所需长度约束的位字符串类型,也可以使用受约束的整数类型将值限制为所需的位数。既然ASN 1及其编码规则与机器体系结构和编程语言无关,那么您就不必担心机器是大的端字节还是小端元,或者通信的一端是否喜欢java而不是C++或C++。一个好的ASN.1工具可以为您处理所有这些。你可以在网站上找到更多关于ASN.1的信息,该网站有一个链接以及一些免费的一些商业广告的列表。我提到UNALIGNED PER的原因是,您可以按照自己的意愿准确地发送该行中的位数,而不需要在中间添加填充位


对于位字符串,您甚至可以将名称分配给对您的应用程序有一定意义的单个位。

位字段的顺序不是天生可移植的-任何此类代码生成器都必须为不同的体系结构生成单独的代码。OTOH,如果您要生成具有可执行正确移位和掩码的内联访问器功能的C++头文件,那么无论如何都可能得到位字段的性能。缺点是必须使用函数语法来访问字段,这将阻止例如field&=value-您必须使用例如obj.fieldobj.field&valueYes!这是最容易安装的,而且示例很简短,易于修改。