2009-03-13 6 views
16

Il mio problema è che voglio analizzare file binari di tipi diversi con un parser generico 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.Esistono framework Java per l'analisi di file binari?

Ho cercato un bel 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 penso di poterli usare per generare qualcosa per analizzare i file binari. Ma potrei sbagliarmi su questa ipotesi.

Esistono framework che si occupano in particolare di un semplice parsing di file binari o qualcuno può darmi un suggerimento su come utilizzare parser/compilatori-generatori per farlo?

Aggiornamento: Sto cercando qualcosa in cui posso scrivere un file-config 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 content-package (che a sua volta consiste in un byte, una stringa lunga e una stringa da 10 byte).

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

risposta

10

dare una prova di preon

+0

Ecco fatto. Grazie! – Kosi2801

+0

Sfortunatamente la licenza è GPL. Aggiornamento: è GPL versione 2. Vedi qui per maggiori informazioni: http://stackoverflow.com/questions/6698740/java-or-c-equivalents-to-preon – shader

+0

@shader - Come un commento su quella domanda indica, è possibile ottenere una licenza commerciale se GPL non funziona per te. –

10

Ho usato DataInputStream per leggere i 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 quadri non sempre rendono le cose più semplici. Nel tuo caso, il file di descrizione è più lungo del codice per leggere semplicemente 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+configuration+file

+1

+1: No quadro. Non è facile analizzare. –

+2

So che i file binari possono avere qualsiasi formato, ma un file PNG ha sempre la stessa struttura, un BMP ha sempre la stessa struttura ... Quello che voglio è: creare una "descrizione" per es. File BMP, alimentarlo nel framework, alimentare un BMP e quindi accedere facilmente a ogni singolo elemento del contenuto analizzato. – Kosi2801

+0

Kosi2801: Se è possibile scrivere specifiche o solo una serie di passaggi "come realmente funziona" per tale framework, allora è fattibile. Se non puoi, non lo è. – Esko

-3

Hai guardato nel mondo dei parser. Un buon parser è yacc e potrebbe esserci una sua porta per java.

-2

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

1

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

3

di Google Protocol Buffers

+1

Ne ho avuto uno sguardo breve ma sembra non fornire l'accesso a livello di bit al contenuto del flusso di dati ma lo incapsula in qualche modo (per fornire opzionalità, ecc.). Anche la mia ipotesi è supportata perché sembra necessario utilizzare i buffer del protocollo su entrambe le estremità del canale di comunicazione. – Kosi2801

12

Utilizzando 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; 

    } 


} 

decodifica dei dati:

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

fatemi sapere se si esegue in problemi.

Problemi correlati