Bom dia, galera do GUJ!!
Estou com um problema para ler um arquivo binário que foi gerado por um programa em C…
A estrutura do arquivo em C é a seguinte:
char ID[32];
unsigned long vers;
unsigned long pix;
unsigned short Ima;
E ae está o problema, pois não sei como fazer a leitura dos unsigned long, short… Usando DataInputStream, .readLong(), .readShort() não funciona…
Já tentei diversas vezes, pesquisei um monte, mas até agora nada.
Alguém tem ideia de como fazer esta leitura?
Obrigado!!
O programa em C rodou em uma máquina Intel/AMD ou Sparc? Só para ter uma idéia.
Olá Javinha,
você está utilizando qual biblioteca para ler o código gerado em C?
Olha este link: https://github.com/twall/jna/blob/master/www/Mappings.md
Eu já utilizei o JNA e recomendo.
Lá em baixo da tabela você encontra a seguinte informação: “Unsigned types use the same mappings as signed types. C enums are usually interchangeable with ‘int’.”
Até mais.
[quote=entanglement]O programa em C rodou em uma máquina Intel/AMD ou Sparc? Só para ter uma idéia.
[/quote]
O programa rodou máquina Intel, sendo possível editar e salvar novamente, mas originalmente é gerado por uma máquina fotográfica térmica.
[quote=JaVinha=]]Bom dia, galera do GUJ!!
Estou com um problema para ler um arquivo binário que foi gerado por um programa em C…
A estrutura do arquivo em C é a seguinte:
char ID[32];
unsigned long vers;
unsigned long pix;
unsigned short Ima;
E ae está o problema, pois não sei como fazer a leitura dos unsigned long, short… Usando DataInputStream, .readLong(), .readShort() não funciona…
Já tentei diversas vezes, pesquisei um monte, mas até agora nada.
Alguém tem ideia de como fazer esta leitura?
Obrigado!![/quote]
É relativamente simples. Digamos que você tenha um método que inverta a ordem dos bytes em um short e em um int (estou chamando, respectivamente, de “ntohs” e “ntohi”).
Tendo esse método, você pode ler esse registro com um DataInputStream assim (digamos que o nome da variável do DataInputStream seja dis) :
byte[] id= new byte[32];
dis.read (id);
int vers = ntohi (dis.readInt ());
int pix = ntohi (dis.readInt());
short ima = ntohs (dis.readShort());
Como strings em C normalmente terminam com ‘\0’, então você deve fazer o seguinte, após ler os bytes de “id”:
a) Localizar o byte 0, se disponível.
b) Converter apenas os bytes até o byte 0 (exclusive), usando new String(byte[]).