Как проанализировать двоичный файл с плавающей точкой (сгенерированный Java) с помощью Cocoa Touch? - PullRequest
2 голосов
/ 31 декабря 2008

С учетом следующего кода Java для создания двоичного файла:

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

Я использую следующий код Objective C и умею анализировать значения int и 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);

Моя проблема на данный момент связана со значением с плавающей запятой: есть какие-нибудь подсказки, как его проанализировать?

Ответы [ 2 ]

5 голосов
/ 31 декабря 2008

Только нам функции и типы, предоставляемые <Foundation/Foundation.h>.

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

Обратите внимание, что они используют специальный тип для удержания числа с плавающей запятой до перестановки байтов. Это связано с тем, что если вы меняете байты значения с плавающей запятой, его можно изменить на Сигнальный NaN, а на некоторых процессорах это вызовет аппаратное исключение, просто назначив его переменной.

2 голосов
/ 31 декабря 2008

Извините, я не могу дать полный ответ, но могу сказать, что Java-число с плавающей точкой сохраняется в файл как четырехбайтовое представление IEEE 754 с плавающей точкой согласно этому документу:

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

Это описывает точную структуру сохраненного значения, так что вы можете прочитать его как int и вручную разобрать биты для значения и экспоненты в число с плавающей точкой. Кажется, должен быть вызов библиотеки для анализа значений с плавающей запятой, упакованных в int этого формата. Надеюсь, кто-то еще узнает о вызове библиотеки, чтобы справиться с этим.

...