0

所以我试图支持一些我在 Java 中编写的用于 J2ME 开发的遗留工具。

我需要在 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");
}

所以文件打开得很好,但数字不匹配。我试过把 Endian 翻过来。我唯一能考虑的是,当我从无符号 (java) 平台转换为有符号 (c++) 平台时,我在那里得到了符号并且它弄乱了价值。

但不确定,任何指针都会受到极大的欢迎。

4

1 回答 1

1

fscanf用于读取文本,而不是用于读取二进制数据。

而不是fscanf,您应该使用fread

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

此外,您应该使用选项“rb”而不是“r”打开文件,以指示您要读取二进制文件。根据操作系统的不同,这可能是必不可少的。

这是正确的,然后这是Java方面:-

好的,所以 Codo 在 C++ 端的答案的混合,这是 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(); 
于 2012-04-16T18:13:27.873 回答