Cocoa Touchを使用して、フロート(Java生成)でバイナリファイルを解析する方法は?
-
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および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);
今のところ私の問題は、float値にあります。それを解析する方法についての手がかりはありますか?
解決
<Foundation/Foundation.h>
が提供する関数と型をご確認ください。
NSSwappedFloat bigEndianFloat;
memcpy(&bigEndianFloat, [[file readDataOfLength:4] bytes], 4);
float floatValue = NSSwapBigFloatToHost(bigEndianFloat);
バイトがスワップされる前に特別な型を使用してフロートを保持することに注意してください。これは、浮動小数点値のバイトをスワップすると、Signing NaNに変更でき、一部のプロセッサーでは、変数に割り当てるだけでハードウェア例外が発生するためです。
他のヒント
申し訳ありませんが、すべての答えを提供することはできませんが、Javaのフロートは、このドキュメントに従ってフロートの4バイトIEEE 754表現としてファイルに保存されていると言えます。
http: //java.sun.com/j2se/1.5.0/docs/api/java/lang/Float.html#floatToIntBits(float)
これは保存された値の正確な構造を記述しているので、intとして読み込んで、仮数と指数のビットを手動で解析して浮動小数点数にすることができます。この形式のintにパックされた浮動小数点値を解析するライブラリ呼び出しがあるはずです。うまくいけば、他の誰かがこれを処理するためのライブラリ呼び出しを知っているでしょう。
所属していません StackOverflow