2010-03-11 9 views
13

Parsec está diseñado para analizar la información textual, pero se me ocurre que Parsec también podría ser adecuado para hacer formato de archivo binario para analizar formatos complejos que implican segmentos condicionales, segmentos fuera de orden, etc.¿Usa Parsec de Haskell para analizar archivos binarios?

¿Hay una capacidad para hacer esto o un paquete alternativo similar que hace esto? Si no, ¿cuál es la mejor manera en Haskell para analizar formatos de archivo binarios?

Respuesta

10

Usted podría estar interesado en AttoParsec, que fue diseñado para este propósito, creo.

2

Funciona bien, aunque es posible que desee utilizar Parsec 3, Attoparsec o Iteratees. La dependencia de Parsec en String como su representación intermedia puede inflar la huella de su memoria un poco, mientras que las otras pueden configurarse para usar ByteStrings.

Las iteraciones son particularmente atractivas porque es más fácil garantizar que no se mantendrán en el comienzo de su entrada y se pueden alimentar con trozos de datos incrementalmente cuando estén disponibles. Esto evita que tenga que leer la entrada completa en la memoria por adelantado y le permite evitar otras soluciones desagradables como la IO lenta.

+1

Ese Parsec está en Text.Parsec implica que es principalmente para texto, no binario, ¿verdad? Incluso para ByteStrings, solo hace que el tipo sea una instancia de Stream y Char. ¿Qué quieres decir con que funciona bien? – me2

1

El mejor enfoque depende del formato del archivo binario.

Muchos formatos binarios están diseñados para facilitar el análisis (a diferencia de los formatos de texto que deben ser leídos principalmente por humanos). Por lo tanto, cualquier tipo de datos de unión estará precedido por un discriminador que le indique qué tipo esperar, todos los campos son de longitud fija o precedidos por un campo de longitud, y así sucesivamente. Para este tipo de datos recomendaría Data.Binary; Por lo general, crea un tipo de datos Haskell coincidente para cada tipo en el archivo y luego convierte a cada uno de esos tipos en una instancia de Binary. Definir el método "get" para leer; devuelve una acción de mónada "Obtener" que es básicamente un analizador muy simple. También necesitarás definir un método "put".

Por otro lado, si sus datos binarios no encajan en este tipo de mundo, entonces necesitará attoparsec. Nunca he usado eso, así que no puedo comentar más, pero this blog post es muy positivo.

12

Las herramientas clave para analizar archivos binarios son:

binario es la solución más general, cereal puede ser grande para los tamaños de datos limitados, y attoparsec está perfectamente bien para, por ejemplo, análisis de paquetes Todos estos están destinados a un rendimiento muy alto, a diferencia de Parsec. También hay muchos ejemplos de pirateo.

+0

Creo que attoparsec es el camino a seguir, pero tengo dificultades para encontrar ejemplos de análisis de datos binarios reales. El único ejemplo es el RFC2616.hs incluido en el repositorio pero que aún analiza texto, no binario. ¿Alguna sugerencia? – me2

+0

attoparsec solo recientemente se sugirió para analizar datos binarios. En el trabajo vamos con Data.Binary y cereal. Hay muchos más ejemplos allí, y para eso está diseñado. attoparsec puede ser más general de lo que necesita. –

Cuestiones relacionadas