Come analizzare un file binario con float (generato da Java) utilizzando Cocoa Touch?
-
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?
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.