Pergunta

Meu problema é que quero analisar arquivos binários de diferentes tipos com um analisador genérico que é implementado em Java. Talvez descrevendo o formato do arquivo com um arquivo de configuração que é lido pelo analisador ou criando classes Java que analisam os arquivos de acordo com algum tipo de análise de análise.

Eu procurei bastante na internet, mas não encontrei quase nada sobre esse tópico.

O que eu encontrei são apenas coisas que lidam com o compilador-geradores (Jay, Cojen etc.), mas não acho que eu possa usá-los para gerar algo para analisar arquivos binários. Mas eu poderia estar errado nessa suposição.

Existem estruturas que lidam especialmente com a análise fácil de arquivos binários ou alguém pode me dar uma dica de como eu poderia usar o analisador/compilador-generadores para fazê-lo?

Atualizar: Estou procurando algo onde posso escrever um arquivo de configuração como

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

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

E gera automaticamente algo que analisa os arquivos que começam com "Magic", seguidos por dez vezes o pacote de conteúdo (que consiste em um byte, uma string longa e de 10 bytes).

Atualização2: Eu encontrei algo comparável ao que estou procurando, "Construir", mas, infelizmente, isso é um trabalho em python. Talvez isso ajude alguém a ter uma idéia, o que estou procurando.

Foi útil?

Solução

experimentar Preon

Outras dicas

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;

  }


}

Decodificação de dados:

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

Deixe -me saber se você está enfrentando problemas.

Eu usei o DatainputStream para ler arquivos binários e escrevo as regras em Java. ;) Arquivos binários podem ter praticamente qualquer formato, para que não haja regra geral sobre como lê -los.

As estruturas nem sempre tornam as coisas mais simples. No seu caso, o arquivo de descrição é mais longo que o código para apenas ler os dados usando um DataAnputStream.

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 você deseja ter um arquivo de configuração, pode usar um arquivo de configuração Java. http://www.google.co.uk/search?q=java+Configuration+File

A Biblioteca de Combinador de Parsers é uma opção. JPARSEC Funciona bem, no entanto, pode ser lento.

Eu tenho desenvolvido uma estrutura para Java, que permite analisar dados binários https://github.com/raydac/java-binary-binar-parsserNo caso, você deve apenas descrever a estrutura do seu arquivo binário em pseudolanguage

Você pode analisar arquivos binários com analisadores como Javacc. Aqui Você pode encontrar um exemplo simples. Provavelmente é um pouco mais difícil do que analisar arquivos de texto.

Você olhou para o mundo dos analistas. Um bom analisador é yacc, e pode haver um porto para Java.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top