2009-03-13 13 views
16

Mi problema es que quiero analizar archivos binarios de diferentes tipos con un analizador genérico que se implementa en JAVA. Tal vez describir el formato de archivo con un archivo de configuración que es leído por el analizador o crear clases de Java que analizan los archivos de acuerdo con algún tipo de reglas de análisis.¿Hay marcos Java para el análisis de archivos binarios?

He buscado bastante en Internet pero no he encontrado casi nada sobre este tema.

Lo que he encontrado son solo cosas que tienen que ver con compiladores-generadores (Jay, Cojen, etc.) pero no creo que pueda usarlos para generar algo para analizar archivos binarios. Pero podría estar equivocado en esa suposición.

¿Hay marcos que se ocupen especialmente de un fácil análisis de archivos binarios o alguien puede darme una pista de cómo podría usar analizadores sintácticos/compiladores para hacerlo?

actualización: estoy buscando algo en el que puedo escribir una config-file como

file: 
    header: FIXED("MAGIC") 
    body: content(10) 

content: 
    value1: BYTE 
    value2: LONG 
    value3: STRING(10) 

y se genera automáticamente algo que analiza los archivos que comienzan con "Magic", seguido de diez veces el paquete de contenido (que a su vez consiste en un byte, una cadena larga y una de 10 bytes).

Update2: he encontrado algo comparable lo que estoy buscando "Construct", pero por desgracia esto es un Python-marco. Tal vez esto ayude a alguien a tener una idea, lo que estoy buscando.

Respuesta

10

darle una oportunidad a preon

+0

Eso es todo. ¡Gracias! – Kosi2801

+0

Lamentablemente, la licencia es GPL. Actualización: Es la versión 2 de GPL. Consulte aquí para obtener más información: http://stackoverflow.com/questions/6698740/java-or-c-equivalents-to-preon – shader

+0

@shader - Como indica un comentario sobre esa pregunta, puede obtener una licencia comercial si GPL no funciona para usted. –

10

He utilizado DataInputStream para leer archivos binarios y escribo las reglas en Java. ;) Los archivos binarios pueden tener casi cualquier formato, por lo que no existe una regla general sobre cómo leerlos.

Los marcos no siempre hacen las cosas más simples. En su caso, el archivo de descripción es más largo que el código para simplemente leer los datos usando un DataInputStream.

public static void parse(DataInput in) throws IOException { 
//  file: 
//   header: FIXED("MAGIC") 
    String header = readAsString(in, 5); 
    assert header.equals("MAGIC"); 
//   body: content(10) 
// ?? not sure what this means 
//  content: 
    for(int i=0;i<10;i++) { 
//   value1: BYTE 
     byte value1 = in.readByte(); 
//   value2: LONG 
     long value2 = in.readLong(); 
//   value3: STRING(10) 
     String value3 = readAsString(in, 10); 
    } 
} 

public static String readAsString(DataInput in, int len) throws IOException { 
    byte[] bytes = new byte[len]; 
    in.readFully(bytes); 
    return new String(bytes); 
} 

Si desea tener un archivo de configuración, puede utilizar un archivo de configuración de Java. http://www.google.co.uk/search?q=java+configuration+file

+1

1: Ningún marco. No es fácil de analizar. –

+2

Sé que los archivos binarios pueden tener cualquier formato, pero un archivo PNG siempre tiene la misma estructura, un BMP siempre tiene la misma estructura ... Lo que quiero es crear una "descripción" para un ej. BMP file, aliméntelo en el framework, alimente un BMP y luego tenga fácil acceso a cada elemento individual del contenido analizado. – Kosi2801

+0

Kosi2801: Si puede escribir especificaciones o solo una serie de pasos "de qué manera funciona" para dicho marco, entonces es factible. Si no puedes, no lo es. – Esko

-3

¿Estás mirando el mundo de los analizadores? Un buen analizador es yacc, y puede haber un puerto para Java.

-2

Puede analizar archivos binarios con analizadores como JavaCC. Here puede encontrar un ejemplo simple. Probablemente es un poco más difícil que analizar archivos de texto.

1

La biblioteca del combinador de analizadores es una opción. JParsec funciona bien, sin embargo, podría ser lento.

3

de Google Protocol Buffers

+1

Lo analicé brevemente, pero parece que no proporciona acceso a nivel de bit al contenido del flujo de datos, pero lo encapsula de alguna manera (para proporcionar opcionalidad, etc.). Mi suposición también está respaldada porque parece ser necesario usar los Buffers de Protocolo en ambos extremos del canal de comunicación. – Kosi2801

12

Usando Preon:

public class File { 

    @BoundString(match="MAGIC") 
    private String header; 

    @BoundList(size="10", type=Body.class) 
    private List<Body> body; 

    private static class Body { 

    @Bound 
    byte value1; 

    @Bound 
    long value2; 

    @BoundString(size="10") 
    String value3; 

    } 


} 

decodificación de datos:

Codec<File> codec = Codecs.create(File.class); 
File file = codecs.decode(codec, buffer); 

Avísame si está ejecutando en problemas.