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

Good library for parsing binary protocols with C++

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

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();

有没有某种库可以让我做到这一点,同时考虑到字节顺序?

我研究了 protobuf 和 cap'n'proto,但当我可以定义协议的两边时,它们看起来都很棒,但我不确定如果我必须解析特定协议,它们是否会很好地发挥作用。这是正确的还是我只是读错了资源?是否有更适合该任务的替代方案?

协议本身是一种简单的面向消息的 TCP 格式:从 TCP 流到消息的处理已经完成,我需要一些东西来解析消息本身。所有的消息都以一个两字节的标识字段开始,它告诉消息的类型,然后是消息数据。例如,对于移动数据包:

0x00 0x01 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x02

[Msg. Id] [int32 X value] [int32 Y value]

我正在寻找一些库,它可以在给定消息结构的情况下将其解析为结构,同时考虑字节顺序,而无需编写手动解析代码。

请注意,这完全属于 "advanced topics",但 Boost.Spirit 支持 endian-specific binary parsing via Qi。如果您有足够的冒险精神去挖掘源代码,那么那里可能有一些东西可以帮助您完成全部或部分任务。

协议描述有点帮助。如果基本类型都是 int32 这个问题就很容易处理了。但是,在我看来,您不太可能找到零解析代码的圣杯,因为这是一个自定义协议,如果简单的话。也许您可以将问题简化为仅解析某些类型的问题 - 然后一个简单的解析器调用一系列 parse(primitiveTypeValue) 函数以附加到每个原语的 std::vector<primitiveType> 可能是可行的。