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

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

  •  03-07-2019
  •  | 
  •  

Вопрос

Приведен следующий Java-код для генерации двоичного файла:

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

Я использую следующий код Objective-C и мне удается разобрать int и короткие значения:

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Float.html#floatToIntBits (плавать)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top