Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C++解析二进制协议的好文库_C++_Network Protocols_Binary Data_Protocol Buffers - Fatal编程技术网

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

用C++解析二进制协议的好文库,c++,network-protocols,binary-data,protocol-buffers,C++,Network Protocols,Binary Data,Protocol Buffers,我必须将我的代码与来自我无法控制的应用程序的一些二进制协议进行接口。到目前为止,我一直在使用数据编写手动解析,如: char *data = ... MovementPacket pkt; pkt.x = data[0] | data[1] << 8; pkt.y = data[2] | data[3] << 8; 考虑到endianness,是否有某种库可以让我这样做 我已经研究了protobuf和cap'n'proto,但是当我可以定义协议的双方时,它们看起来都很棒

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

char *data = ...
MovementPacket pkt;
pkt.x = data[0] | data[1] << 8;
pkt.y = data[2] | data[3] << 8;
考虑到endianness,是否有某种库可以让我这样做

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

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

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

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

我正在寻找一个库,它可以在给定消息结构的情况下,将其解析为一个结构,考虑到endianness,而无需编写手动解析代码。

请注意,这属于高级主题,但Boost.Spirit支持。如果你有足够的冒险精神去挖掘源头,可能会有一些东西帮助你完成全部或部分任务


协议描述有些帮助。如果原语类型都是int32,那么这个问题是很容易处理的。然而,在我看来,您不太可能找到这种零解析代码的圣杯,因为这是一种定制的(如果简单的话)协议。也许您可以将问题简化为只解析某些类型的问题—然后,一个简单的解析器调用一系列parseprimitiveTypeValue函数为每个基元附加到std::vector中可能是可行的。

您的意思是想在一侧使用生成的协议吗?@jacek我不太理解这个问题。你是在问我对protobuf的看法吗?如果这是新的aka green field协议,不要害怕使用类似的库。我在生产中节俭。非常舒适的类型安全代码。可能使用FlatBuffers是低分配要求。我认为这些库都不能帮助解析旧的手动协议。是的,我读过Boost.Spirit,但我真的在寻找一些简单理解的东西。也许您必须解析的协议的更多细节会得到更好的答案。添加了编辑消息示例。这并不是一个复杂的协议,只是有很多不同的消息,都是由基本类型组成的。这是你问的吗?
0x00 0x01 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x02

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