2012-04-16 10 views
0

私はJ2ME開発のためにJavaで書いたレガシーツールをサポートしようとしています。STL/POSIXを使用して、J2SEからiOS iphoneにバイナリファイルをロード

iphone/ipadのC++で同じファイル形式で読む必要があります。あなたが尋ねる前に、なぜ - >

今私は値が一致し、私はそれを右に持っていることを確認イムことを得るカント(私もAndroidのNDK R7をサポートする必要があるとして):ここに私のJava(J2SE)のコードである: -

File file = new File(location, "test.d2r"); 

BufferedWriter writer = new BufferedWriter(new FileWriter(file)); 

int i = Integer.reverseBytes(8); 

writer.write(i); 
writer.newLine(); 
writer.flush(); 
writer.close(); 

とiOSの土地イム行う際に: -

NSString *url = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"d2r"]; 

FILE* fp = fopen([url UTF8String], "r"); 

if (fp) 
{ 
    int j; 
    printf("\nReading...\n"); 

    fscanf(fp, "%c", &j); 
    fclose(fp); 

    printf("DIGIT 1 %d\n\n", j); 
} 
else 
{ 
    printf("\n\n No file found...... \n\n"); 
} 

だから、ファイルが正常に開きますが、番号が一致しません。 IveはEndianを裏返そうとしました。私が考慮できる唯一のことは、署名されていない(java)プラットフォームから署名された(C++)プラットフォームに変換するときに、私はそこにサインを取得していて、その値を乱しているということです。

確かに、どのポインタも大歓迎です。

答えて

1

fscanfは、バイナリデータを読み取るためのものではありません。代わりにfscanf

、あなたはfreadを使用する必要があります。

fread(&j, 4, 1, fp); 

Futhermoreは、オプション「RB」でファイルを開く必要があります代わりに「R」のバイナリファイルを読みたいことを示すために。運用システムによっては、これが不可欠な場合もあります。

これが正しいと、これはJava側である: -

[OK]をC++側のCodoの答えの混合物ので、これは、Java側の書き込み操作

BufferedOutputStream out = new BufferedOutputStream( 
        new FileOutputStream("bob_FontTool.d2r", false)); 

ByteBuffer buffer = ByteBuffer.allocate(4).order(ByteOrder.nativeOrder()); 
buffer.putInt(8); 
out.write(buffer.array()); 

out.flush(); 
out.close(); 
+0

乾杯で、Iさらにint * []と++のポインタを読み込んで同じ数値を取得していましたが、C++側を修正しましたが、数字が正しくないので、4バイトが間違った順序で書き込まれています。 – Dev2rights