簡體   English   中英

使用Haskell的Parsec解析二進制文件?

[英]Using Haskell's Parsec to parse binary files?

Parsec旨在解析文本信息,但是在我看來,Parsec也可能適合於對涉及條件段,亂序段等的復雜格式進行二進制文件格式解析。

是否有能力執行此操作或執行此操作的類似替代軟件包? 如果沒有,Haskell解析二進制文件格式的最佳方法是什么?

解析二進制文件的關鍵工具是:

二進制是最通用的解決方案,Cereal對於有限的數據大小可能非常有用,而attoparsec則非常適合例如數據包解析。 與Parsec不同,所有這些目標都是針對非常高的性能。 關於黑客的例子也很多。

我想您可能對為此目的而設計的AttoParsec感興趣。

我已經成功使用了Data Binary

盡管您可能想使用Parsec 3,Attoparsec或Iteratees,它仍然可以正常工作。 Parsec依賴String作為其中間表示形式可能會使您的內存占用空間大大膨脹,而可以將其他配置為使用ByteStrings。

迭代器特別有吸引力,因為它可以更容易地確保它們不會停留在輸入的開頭,並且可以在可用時以增量方式喂入大塊數據。 這樣可以避免您必須預先將整個輸入讀取到內存中,並且可以避免其他令人討厭的變通方法,例如惰性IO。

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

許多二進制格式旨在簡化解析(不同於主要由人類讀取的文本格式)。 因此,任何聯合數據類型都將以區分符(告訴您要使用哪種類型)開頭,所有字段均為固定長度或以長度字段開頭,依此類推。 對於這種數據,我建議使用Data.Binary; 通常,您為文件中的每種類型創建一個匹配的Haskell數據類型,然后將這些類型中的每一個作為Binary的實例。 定義讀取的“獲取”方法; 它返回一個“獲取”單子動作,這基本上是一個非常簡單的解析器。 您還需要定義“ put”方法。

另一方面,如果您的二進制數據不適合這種情況,那么您將需要attoparsec。 我從未使用過它,因此我無法進一步評論,但是這篇博客文章非常積極。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM