2010-03-11 94 views
13

Parsec旨在解析文本信息,但對我而言,Parsec可能也適合對涉及條件段,亂序段等的複雜格式進行二進制文件格式解析。使用Haskell的Parsec解析二進制文件?

Is there有能力做到這一點或類似的替代包,這樣做?如果沒有,Haskell解析二進制文件格式的最佳方法是什麼?

回答

10

您或許對AttoParsec感興趣,我認爲這是爲此目的而設計的。

2

它工作正常,但您可能想使用Parsec 3,Attoparsec或Iteratees。 Parsec依賴字符串作爲其中間表示可能會增加你的內存佔用量,而其他的可以配置爲使用ByteStrings。

迭代器特別有吸引力,因爲它更容易確保它們不會保留在輸入的開頭,並且可以在它們可用時遞增地輸入大量數據。這樣可以防止您必須事先將整個輸入讀入內存,並且可以避免其他惡意解決方法,如惰性IO。

+1

Parsec是在Text.Parsec意味着它主要是文本,而不是二進制,對嗎?即使對於ByteStrings,它也只是將該類型作爲Stream和Char的實例。你是什​​麼意思,它工作正常? – me2 2010-03-11 16:53:33

1

最好的方法取決於二進制文件的格式。

許多二進制格式旨在使解析變得簡單(不同於主要由人類閱讀的文本格式)。因此,任何聯合數據類型都會有一個鑑別符,它告訴您預期的類型,所有的字段都是固定長度,或者以長度字段開頭,等等。對於這種數據,我會推薦Data.Binary;通常您會爲文件中的每種類型創建一個匹配的Haskell數據類型,然後將這些類型中的每一個都作爲Binary的一個實例。定義讀取的「get」方法;它返回一個「Get」monad動作,它基本上是一個非常簡單的解析器。你還需要定義一個「put」方法。

另一方面,如果你的二進制數據不適合這種世界,那麼你將需要attoparsec。我從來沒有使用過,所以我不能進一步評論,但this blog post是非常積極的。

12

解析二進制文件的主要工具是:

二進制是最通用的解決方案,穀物可以是偉大有限的數據大小,而attoparsec對於例如數據包解析。與Parsec不同,所有這些都是針對非常高的性能。 hackage也有很多例子。

+0

我認爲attoparsec是要走的路,但我很難找到解析實際二進制數據的例子。唯一的例子是存儲庫中包含的RFC2616.hs,但它仍然解析文本,而不是二進制文件。有什麼建議麼? – me2 2010-03-12 05:43:04

+0

attoparsec最近才被建議用於解析二進制數據。在工作中,我們使用Data.Binary和穀類。這裏有更多的例子,這就是它的設計目的。 attoparsec可能比你需要的更一般。 – 2010-03-12 06:33:46