繁体   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