使用C 解析二进制协议的好库

Good library for parsing binary protocols with C++

本文关键字:协议 二进制 使用      更新时间:2023-10-16

我必须将代码与来自我无法控制的应用程序发出的一些二进制协议连接。到目前为止,我一直在写手册从数据中解析,如:

char *data = ...
MovementPacket pkt;
pkt.x = data[0] | data[1] << 8;
pkt.y = data[2] | data[3] << 8;

很明显,这个过程非常容易出错且乏味。我记得在Java中这样做:

pkt.x = stream.readShort();
pkt.y = stream.readShort();

是否有某种图书馆可以考虑到Endians?

我已经研究了Protobuf和cap'n'proto,但是当我可以定义协议的两面时,两者看起来都很棒,但我不确定如果我不得不解析特定的协议,它们是否会很好。这是正确的还是我只是阅读了错误的资源?是否有更适合该任务的替代方案?

协议本身是一种简单的面向消息的格式:已经完成了从TCP流到消息的处理,我希望某些东西可以解析消息本身。所有消息以两个字节标识字段开始,该字段告诉消息类型,然后是消息数据。一个示例,适用于运动数据包:

0x00 0x01 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x02
[Msg. Id] [int32 X value] [int32 Y value]

我正在寻找一些可以考虑到消息结构的库,该库考虑到dendianness,而无需编写手动解析代码。

可以警告说,这是牢固地属于"高级主题",但是 boost.spirit 支持通过QI进行Endian特定的二进制解析。如果您有足够的冒险精神来挖掘来源,可能会有一些可以帮助您完成所有任务的工作。

协议描述有些有用。如果原始类型都是int32,则此问题非常可解决。但是,在我看来,您不太可能找到零解析代码的圣杯,因为这是一种习惯(如果简单,协议)。也许您可以将问题简化为仅解析某些类型的一种 - 然后,一个调用一系列parse(primitiveTypeValue)函数以将每个原始函数附加到std::vector<primitiveType>的简单解析器可能是可行的。