Existem estruturas Java para análise de arquivos binários?
-
22-07-2019 - |
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.
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
Google's Buffers de protocolo
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ê olhou para o mundo dos analistas. Um bom analisador é yacc, e pode haver um porto para Java.