¿Cómo analizar un archivo binario con flotantes (generado por Java) usando Cocoa Touch?

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

  •  03-07-2019
  •  | 
  •  

Pregunta

Dado el siguiente código Java para generar un archivo binario:

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

Estoy usando el siguiente código Objective-C y logro analizar los valores int y short:

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

Mi problema por ahora es con el valor flotante: ¿alguna pista sobre cómo analizarlo?

¿Fue útil?

Solución

Solo usen las funciones y tipos proporcionados por <Foundation/Foundation.h>.

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

Tenga en cuenta que utilizan un tipo especial para mantener el flotante antes de que se intercambien los bytes. Esto se debe a que si intercambia los bytes de un valor de coma flotante, se puede cambiar a un NaN de señalización y, en algunos procesadores, esto provocará una excepción de hardware al asignarlo a una variable.

Otros consejos

Lo siento, no puedo proporcionar la respuesta completa, pero puedo decir que el flotante de Java se guarda en el archivo como una representación IEEE 754 de cuatro bytes del flotante según este documento:

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

Eso describe la estructura exacta del valor guardado, por lo que puede leerlo como int y analizar manualmente los bits para el significado y el exponente en un flotante. Parece que debería haber una llamada a la biblioteca para analizar los valores de coma flotante empaquetados en un int de este formato. Esperemos que alguien más sepa de una llamada a la biblioteca para manejar esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top