Используете Parsec в Haskell для анализа двоичных файлов? - PullRequest
13 голосов
/ 11 марта 2010

Parsec предназначен для анализа текстовой информации, но мне кажется, что Parsec также может быть пригоден для анализа двоичных форматов файлов для сложных форматов, которые включают условные сегменты, сегменты вне порядка и т. Д.

Есть ли возможность сделать это или подобный, альтернативный пакет, который делает это? Если нет, то как лучше всего проанализировать двоичные форматы файлов в Haskell?

Ответы [ 5 ]

12 голосов
/ 11 марта 2010

Ключевые инструменты для анализа двоичных файлов:

Двоичное решение является наиболее общим решением, Cereal может отлично подойти для ограниченных размеров данных, а attoparsec отлично подходит, например, для. разбор пакетов. Все они нацелены на очень высокую производительность, в отличие от Parsec. Есть также много примеров взлома.

10 голосов
/ 11 марта 2010

Вас может заинтересовать AttoParsec , который был разработан для этой цели, я думаю.

4 голосов
/ 11 марта 2010

Я использовал Двоичные данные успешно.

2 голосов
/ 11 марта 2010

Работает нормально, хотя вы можете использовать Parsec 3, Attoparsec или Iteratees. Опора Parsec на String в качестве ее промежуточного представления может значительно увеличить объем памяти, в то время как другие могут быть настроены на использование ByteStrings.

Итерации особенно привлекательны, потому что легче гарантировать, что они не будут держаться в начале вашего ввода и могут получать куски данных постепенно, по мере их поступления. Это предотвращает необходимость предварительного чтения всего ввода в память и позволяет избежать других неприятных обходных путей, таких как ленивый ввод-вывод.

1 голос
/ 11 марта 2010

Лучший подход зависит от формата двоичного файла.

Многие двоичные форматы разработаны для упрощения анализа (в отличие от текстовых форматов, которые в первую очередь должны читаться людьми). Таким образом, любому типу данных объединения будет предшествовать дискриминатор, который сообщает вам, какой тип следует ожидать, все поля имеют либо фиксированную длину, либо предшествуют полю длины, и так далее. Для такого рода данных я бы порекомендовал Data.Binary; обычно вы создаете соответствующий тип данных Haskell для каждого типа в файле, а затем делаете каждый из этих типов экземпляром Binary. Определите метод «get» для чтения; он возвращает монадное действие «Get», которое по сути является очень простым синтаксическим анализатором. Вам также необходимо определить метод "put".

С другой стороны, если ваши двоичные данные не вписываются в этот мир, вам потребуется attoparsec. Я никогда не использовал это, поэтому я не могу комментировать дальше, но это сообщение в блоге очень позитивно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...