【问题标题】:Good library for parsing binary protocols with C++用 C++ 解析二进制协议的好库
【发布时间】:2016-12-06 14:14:06
【问题描述】:

我不得不将我的代码与来自我无法控制的应用程序的一些二进制协议接口。到目前为止,我一直在编写手动解析数据,如下所示:

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]

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

【问题讨论】:

  • 您的意思是“想在一侧使用生成的协议”吗?
  • @jacek 我不太明白这个问题。你是在问我所说的关于 protobuf 的内容吗?
  • 如果这是新的(又名“绿地”)协议,不要害怕使用类似的库。我在生产中使用 Thrift。类型安全代码非常舒适。也许使用 FlatBuffers 是低分配要求。我认为这些库都不能帮助解析旧的“手动”协议。

标签: c++ network-protocols binary-data protocol-buffers


【解决方案1】:

请注意,这完全属于“高级主题”,但 Boost.Spirit 支持 endian-specific binary parsing via Qi。如果你有足够的冒险精神去挖掘源头,那里可能有一些东西可以帮助你完成全部或部分任务。

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

【讨论】:

  • 是的,我已经阅读了 stackoverflow.com/q/285200/1119282 关于 Boost.Spirit 的内容,但我真的在寻找更简单的东西
  • 明白。也许更多关于你必须解析的协议的细节会得到更好的答案。
  • 添加了带有消息示例的编辑。这并不是一个真正复杂的协议,只是有很多不同的消息,都由原始类型组成。这是你问的吗?
猜你喜欢
  • 1970-01-01
  • 2011-03-31
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
相关资源
最近更新 更多