2013-05-21 72 views
3

您能否建議一個經過驗證的用於C的二進制流解析庫?這將是很好的,如果它會像C允許的那樣聲明。C的二進制流解析庫C

我需要它進行二進制協議解析,並通過它的正式規範來描述相當複雜的協議,這就是爲什麼我要儘可能多地聲明它。類似於 Haskell的Data.Binary.Get會很棒。

我發現binpac,但似乎重量級和麪向C++的,但該項目是純C.

舉例說明我的意思:

parser_t parsers[] = { 
    { get_bit,  out_field1, &pkt.field1 } 
,{ get_bit7,  0,   0   } // skip 7 bits 
,{ get_word16be, out_field2, &pkt.field2 } 
,{ 0,   0,   0   } // end 
}; 

// skip 
// char *data, char *data_end, 
map_parsers(data, data_end, parsers); // parse stream 

UPD。只需要一個快速的庫即可從內存中順序讀取位,字,對齊,未對齊等等就可以了。我可以自己編寫聲明式前端甚至DSL。

+0

C沒有流構造,也許如果你給了我們一些示例數據,你從哪裏得到它,例如FIFO,命名管道等,那麼我們可以指向你的工具或庫。 –

+0

char *夠好。例如: – voidlizard

+0

在問題 – voidlizard

回答

6

還有PADS來自AT & T.的好人。還有RAGEL可以用於同樣的事情。我自己也沒有用過,但在this page上發現了它們存在的提示。

PADS看起來與Objective Systems和Google Protocol緩衝區中的ASN1編譯器類似,您編寫一個模式文件,然後將其編譯爲您選擇的源代碼語言。當然這兩者之間的區別在於,這兩種方法適用於嚴格定義的二進制編碼方案,而PADS似乎適用於任意數據流。

祝你好運!

+0

我需要解析文本數據時使用Ragel,但這對於這樣的任務不是很方便。我會盡量和PADS一起玩,謝謝。 – voidlizard

+1

我已經使用過Ragel,我最喜歡它。它看起來更像處理文本文件而不是二進制文件,但當然,8位字符和8位字節沒有太大區別。有一件事 - 它主要是基於常規語法的。有一些技巧可以明確推送信息。到堆棧等,但至少在理論上可能超過它的能力(例如需要一個上下文無關的語法)。但實際上,我懷疑在二進制文件中會發生什麼 - 在文本文件中,它僅僅意味着您使用Ragel作爲標記器並且在頂部分層分析器。 – Steve314

+0

嗨,我注意到PAD鏈接不再有效。有沒有人有可以提供的副本或知道它現在託管的位置? – casillic