Domanda

Il mio problema è che voglio analizzare i file binari di diversi tipi con un parser generico che è implementato in JAVA. Forse descrivendo il formato del file con un file di configurazione che viene letto dal parser o creando classi Java che analizzano i file secondo una sorta di regole di analisi.

Ho cercato un po 'su Internet ma non ho trovato quasi nulla su questo argomento.

Quello che ho trovato sono solo cose che riguardano i generatori di compilatori (Jay, Cojen, ecc.) ma non credo di poterli usare per generare qualcosa per l'analisi dei file binari. Ma potrei sbagliarmi su questa ipotesi.

Esistono dei framework che si occupano in particolare dell'analisi semplice dei file binari o qualcuno può darmi un suggerimento su come usare parser / compilatore-generatori per farlo?

Aggiorna : Sto cercando qualcosa in cui posso scrivere un file di configurazione come

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

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

e genera automaticamente qualcosa che analizza i file che iniziano con " MAGIC " ;, seguito da dieci volte il pacchetto di contenuto (che a sua volta consiste in un byte, una lunga e una stringa di 10 byte).

Update2 : Ho trovato qualcosa di paragonabile a quello che sto cercando, " Construct " ;, ma purtroppo questo è un Python -Struttura. Forse questo aiuta qualcuno a farsi un'idea, quello che sto cercando.

È stato utile?

Soluzione

prova a preon

Altri suggerimenti

Utilizzo di 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;

  }


}

Dati di decodifica:

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

Fammi sapere se stai riscontrando problemi.

Ho usato DataInputStream per leggere file binari e scrivo le regole in Java. ;) I file binari possono avere praticamente qualsiasi formato, quindi non esiste una regola generale su come leggerli.

I frame non sempre rendono le cose più semplici. Nel tuo caso, il file di descrizione è più lungo del codice per leggere i dati utilizzando 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);
}

Se si desidera avere un file di configurazione, è possibile utilizzare un file di configurazione Java. http://www.google.co.uk/search?q=java + configurazione + il file

La libreria combinatrice parser è un'opzione. JParsec funziona bene, tuttavia potrebbe essere lento.

Ho sviluppato un framework per Java che consente di analizzare i dati binari https: // github.com/raydac/java-binary-block-parser nel caso dovresti semplicemente descrivere la struttura del tuo file binario in pseudolanguage

Puoi analizzare i file binari con parser come JavaCC . Qui puoi trovare un semplice esempio. Probabilmente è un po 'più difficile dell'analisi dei file di testo.

Stai guardando nel mondo dei parser. Un buon parser è yacc e potrebbe esserci una porta per java.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top