2016-12-06 99 views
0

我不得不將接口我的代碼與來自我無法控制的應用程序的一些二進制協議。到目前爲止,我已經從數據寫入手工解析,如:用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(); 

是否有某種庫,使我能夠做到這一點,考慮到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] 

我尋找可能,給定的消息結構,它解析成一個結構,考慮到端序某些庫,而無需編寫手動解析代碼。

+0

您的意思是「想在一側使用生成的協議」? –

+0

@jacek我真的不明白這個問題。你在問我關於protobuf的評論嗎? –

+0

如果這是新的(又名「綠色領域」)協議,不要害怕使用類似的庫。我在生產中使用Thrift。非常好的類型安全代碼。也許使用FlatBuffers是低配置要求。我認爲沒有這樣的庫可以幫助解析舊的「手動」協議。 –

回答

2

被警告說這個問題嚴重落在「高級話題」之下,但Boost.Spirit支持endian-specific binary parsing via Qi。如果你有足夠的冒險精神挖掘信息來源,那麼可能有些事情可以幫助你完成全部或部分任務。

協議描述有些幫助。如果原始類型都是int32這個問題很難處理。然而,在我看來,你不可能找到這個零解析代碼的聖盃,因爲這是一個自定義的,如果簡單的協議。也許你可以將問題簡化爲只解析某些類型的問題 - 然後一個簡單的解析器調用一系列parse(primitiveTypeValue)函數以附加到每個原語的std::vector<primitiveType>可能是可行的。

+0

是的,我已閱讀http://stackoverflow.com/q/285200/1119282關於Boost.Spirit,但我真的很想找一些簡單的 –

+0

瞭解。也許有關協議的更多細節需要解析才能找到更好的答案。 –

+0

增加了帶有消息示例的編輯。這不是一個複雜的協議,只有很多不同的消息,都是由原始類型組成的。這是你問的嗎? –