Como analisar um arquivo binário com flutuadores (Java gerada) usando Cocoa Touch?

StackOverflow https://stackoverflow.com/questions/401783

  •  03-07-2019
  •  | 
  •  

Pergunta

Dado o seguinte código Java para gerar um arquivo binário:

DataOutputStream out = new DataOutputStream(new FileOutputStream("foo.dat"));
out.writeInt(1234);
out.writeShort(30000);
out.writeFloat(256.384f);

Eu estou usando o seguinte código Objective-C e conseguem analisar o int e os valores curtas:

NSString *path = [[NSBundle mainBundle] pathForResource:@"foo" ofType:@"dat"];
NSFileHandle *file = [NSFileHandle fileHandleForReadingAtPath:path];

unsigned long intValue;
memcpy(&intValue, [[file readDataOfLength:4] bytes], 4);
intValue = NSSwapBigLongToHost(intValue);

unsigned short shortValue;
memcpy(&shortValue, [[file readDataOfLength:2] bytes], 2);
shortValue = NSSwapBigShortToHost(shortValue);

O meu problema agora é com o valor float:? Quaisquer pistas sobre como analisá-lo

Foi útil?

Solução

Apenas nos as funções e tipos fornecidos pelo <Foundation/Foundation.h>.

NSSwappedFloat bigEndianFloat;
memcpy(&bigEndianFloat, [[file readDataOfLength:4] bytes], 4);
float floatValue = NSSwapBigFloatToHost(bigEndianFloat);

Note que eles usam um tipo especial de segurar a bóia antes dos bytes são trocados. Isso porque, se você trocar os bytes de um valor de ponto flutuante, ele pode ser transformado em um Sinalização NaN, e em alguns processadores, isso fará com que uma exceção de hardware por apenas atribuí-la a uma variável.

Outras dicas

Infelizmente não posso dar a resposta todo, mas posso dizer o flutuador Java é salvo no arquivo como um de quatro bytes IEEE 754 representação do flutuador de acordo com este documento:

http: //java.sun.com/j2se/1.5.0/docs/api/java/lang/Float.html#floatToIntBits(float)

Isso descreve a estrutura exata do valor guardado, para que você possa lê-lo em como um int e manualmente analisar os bits para o significando e um expoente para um float. Parece que deve haver uma chamada da biblioteca para analisar valores de ponto flutuante embalados em um int deste formato. Esperemos que alguém vai saber de uma chamada de biblioteca para lidar com isso.

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