【发布时间】: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