Pregunta

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

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

Lo que he encontrado son solo cosas que tratan con generadores de compiladores (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 algún marco que se ocupe especialmente del análisis fácil de archivos binarios o alguien puede darme una pista de cómo podría usar el generador de analizadores / compiladores para hacerlo?

Actualización : Estoy buscando algo donde pueda escribir un archivo de configuración como

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

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

y genera automáticamente algo que analiza los archivos que comienzan con "MAGIC", seguido de diez veces el paquete de contenido (que en sí mismo consiste en un byte, una cadena larga y una de 10 bytes).

Actualización2 : Encontré algo comparable a lo que estoy buscando, " Construir " ;, pero lamentablemente este es un Python -Marco de referencia. Tal vez esto ayude a alguien a tener una idea de lo que estoy buscando.

¿Fue útil?

Solución

pruebe preon

Otros consejos

Uso de 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;

  }


}

Datos de decodificación:

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

Avísame si tienes problemas.

He usado 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 simplifican las cosas. En su caso, el archivo de descripción es más largo que el código para leer los datos utilizando 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 usar un archivo de configuración de Java. http://www.google.co.uk/search?q=java + configuración + archivo

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

He estado desarrollando un marco para Java que permite analizar datos binarios https: // github.com/raydac/java-binary-block-parser en el caso, simplemente debe describir la estructura de su archivo binario en pseudolenguaje

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

¿Estás buscando en el mundo de los analizadores sintácticos? Un buen analizador es yacc , y puede haber un puerto para java.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top