Используя Парсек Haskell для парсинга двоичных файлов?

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

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

13
задан Don Stewart 17 April 2011 в 18:59
поделиться

5 ответов

????????, ??? ???????????? AttoParsec , ???????, ? ?????, ??? ?????????? ??? ???? ????.

10
ответ дан 1 December 2019 в 20:42
поделиться

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

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

2
ответ дан 1 December 2019 в 20:42
поделиться

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

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

12
ответ дан 1 December 2019 в 20:42
поделиться

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

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

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

1
ответ дан 1 December 2019 в 20:42
поделиться

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

4
ответ дан 1 December 2019 в 20:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: