Использование Haskell Parsec для разбора двоичных файлов?

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

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

Ответ 1

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

Ответ 2

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

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

Ответ 3

Я успешно использовал Data Binary.

Ответ 4

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

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

Ответ 5

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

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

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