코코아 터치를 사용하여 플로트 (Java 생성)로 이진 파일을 구문 분석하는 방법은 무엇입니까?

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

지금의 내 문제는 플로트 값에 관한 것입니다 : 그것을 구문 분석하는 방법에 대한 단서가 있습니까?

도움이 되었습니까?

해결책

단지 우리에게 제공되는 기능과 유형 <Foundation/Foundation.h>.

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

바이트가 교환되기 전에 플로트를 고정하기 위해 특수 유형을 사용합니다. 플로팅 포인트 값의 바이트를 교환하면 신호 NAN으로 변경 될 수 있으며 일부 프로세서에서는 변수에 할당하여 하드웨어 예외가 발생하기 때문입니다.

다른 팁

죄송합니다 전체 답변을 제공 할 수는 없지만 Java Float가 파일에 4 바이트 IEEE 754 표현 으로이 문서에 따라 플로트의 표현으로 저장되었다고 말할 수 있습니다.

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

그것은 저장된 값의 정확한 구조를 설명하므로 int로 읽고 수동으로 유의성과 지수를 플로트로 구문 분석 할 수 있습니다. 이 형식의 int에 플로팅 포인트 값을 구문 분석하기위한 라이브러리 호출이 있어야합니다. 바라건대 다른 사람이이를 처리하기 위해 도서관 전화를 알게되기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top