Parsec旨在解析文本信息,但我发现Parsec也适合对包含条件段,无序段等的复杂格式进行二进制文件格式解析。
是否有能力执行此操作或类似的替代包执行此操作?如果没有,Haskell解析二进制文件格式的最佳方法是什么?
答案 0 :(得分:12)
解析二进制文件的关键工具是:
二进制是最通用的解决方案,谷歌可以用于有限的数据大小,而attoparsec对于例如数据包解析。与Parsec不同,所有这些都旨在实现非常高的性能。关于hackage也有很多例子。
答案 1 :(得分:10)
我可能会对AttoParsec感兴趣,我认为这是为此目的而设计的。
答案 2 :(得分:4)
我已成功使用Data Binary。
答案 3 :(得分:2)
虽然你可能想要使用Parsec 3,Attoparsec或Iteratees,但它工作正常。 Parsec依赖于String作为其中间表示可能会使内存占用空间膨胀,而其他可以配置为使用ByteStrings。
Iteratees特别有吸引力,因为它更容易确保它们不会保留在输入的开头,并且可以在它们可用时递增地提供数据块。这可以防止您必须事先将整个输入读入内存,并且可以避免其他令人讨厌的变通办法,例如懒惰的IO。
答案 4 :(得分:1)
最佳方法取决于二进制文件的格式。
许多二进制格式旨在简化解析(与主要由人类阅读的文本格式不同)。因此,任何联合数据类型前面都会有一个鉴别器,它告诉您期望的类型,所有字段都是固定长度或前面是长度字段,依此类推。对于这种数据,我建议使用Data.Binary;通常,您为文件中的每种类型创建匹配的Haskell数据类型,然后使这些类型中的每一种都成为二进制的实例。定义阅读的“获取”方法;它返回一个“Get”monad动作,它基本上是一个非常简单的解析器。您还需要定义一个“put”方法。
另一方面,如果您的二进制数据不适合这种世界,那么您将需要attoparsec。我从来没有使用过,所以我不能进一步评论,但this blog post非常积极。