Frage

den folgenden Java-Code zum Erzeugen einer Binärdatei Gegeben:

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

Ich bin mit dem folgenden Objective-C-Code und verwalten die int und die kurzen Werte analysieren:

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

Mein Problem jetzt mit dem Float-Wert: keine Hinweise, wie man es analysieren

War es hilfreich?

Lösung

Sie uns einfach die Funktionen und Arten von <Foundation/Foundation.h> zur Verfügung gestellt.

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

Beachten Sie, dass sie eine besondere Art verwenden, um den Schwimmer zu halten, bevor der Bytes vertauscht. Dies liegt daran, wenn Sie die Bytes eines Gleitkommawert tauschen, kann es in einem Signaling NaN, und auf einigen Prozessoren geändert werden, wird dies eine Hardware-Ausnahme verursachen, indem es nur einer Variablen zugewiesen wird.

Andere Tipps

Leider kann ich die ganze Antwort nicht liefern, aber ich kann der Java-float sagen wird in die Datei als gemäß diesem Dokument Vier-Byte IEEE 754 Darstellung des Schwimmers gespeichert:

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

Das beschreibt die genaue Struktur des Wertes gespeichert, so dass Sie es in als int lesen konnte und manuell die Bits für die Mantisse analysieren und in einen Float Exponent. Es scheint, sollte es eine Bibliothek Aufruf sein Gleitkommazahlen in ein int dieses Format gepackt zu analysieren. Hoffentlich wird jemand anderes weiß eine Bibliothek Anruf zu handhaben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top