Come analizzare un file binario con float (generato da Java) utilizzando Cocoa Touch?

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

  •  03-07-2019
  •  | 
  •  

Domanda

Dato il seguente codice Java per la generazione di un file binario:

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

Sto usando il seguente codice Objective-C e riesco ad analizzare i valori int e 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);

Il mio problema per ora è con il valore float: qualche indizio su come analizzarlo?

È stato utile?

Soluzione

Solo noi le funzioni e i tipi forniti da <Foundation/Foundation.h>.

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

Nota che usano un tipo speciale per contenere il float prima che i byte vengano scambiati. Questo perché se si scambiano i byte di un valore in virgola mobile, è possibile modificarlo in un NaN di segnalazione e, su alcuni processori, ciò causerà un'eccezione hardware semplicemente assegnandolo a una variabile.

Altri suggerimenti

Spiacente, non posso fornire l'intera risposta, ma posso dire che il float Java viene salvato nel file come rappresentazione IEEE 754 a quattro byte del float come da questo documento:

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

Questo descrive l'esatta struttura del valore salvato, in modo da poterlo leggere come int e analizzare manualmente i bit per il significato e l'esponente in un float. Sembra che ci dovrebbe essere una chiamata in libreria per analizzare i valori in virgola mobile inseriti in un int di questo formato. Spero che qualcun altro sappia di una chiamata in biblioteca per gestire questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top