1

我有一个用 C 编写的二进制文件,我想用 java 读取它。我用 C 写了这样的文件:

void Log(TCHAR *name,int age){
    write_int(file, 2012);
    write_int(file, 4);
    write_int(file, 16);
    write_int(file, 12);
    write_int(file, 58);
    write_int(file, 50);

    fwrite(&name, sizeof(name), 1, file);
    fwrite(&age, sizeof(age), 1, file);
    fflush(processusFile);
}

在 Java 中,我使用BinaryFilehttp://www.heatonresearch.com/code/22/BinaryFile.java我这样做:

RandomAccessFile f = new RandomAccessFile("myfile.dat", "r");
BinaryFile binaryFile = new BinaryFile(f);
ArrayList<String> text = new ArrayList<>();
while (true) {
try {
    Calendar calendar = new GregorianCalendar();
    int year = (int) binaryFile.readDWord();
    int month = (int) binaryFile.readDWord();
    int date = (int) binaryFile.readDWord();
    int hourOfDay = (int) binaryFile.readDWord();
    int minute = (int) binaryFile.readDWord();
    int second = (int) binaryFile.readDWord();

    calendar.set(year, month, date, hourOfDay, minute, second); 
    System.out.println(binaryFile.readFixedString(64));    
    catch (Exception e) {
        break;  
    }
}

这对 char* 不起作用,但对 int 起作用。我如何编写字符串?

4

4 回答 4

1

这是因为是系统上指针sizeof(name)的大小,而不是字符串的长度。您还需要将长度与字符串分开写出。char

size_t len = strlen(name);
write_int(file, len);
fwrite(&name, len, sizeof(char), file);
于 2012-04-16T14:49:13.663 回答
1

您必须注意输入“int”。

java 中的 int 始终是 32 位,而 C 中并非如此。在 C 中它可能是 16、32、64 位

于 2012-04-16T14:49:23.680 回答
1

这是错误的:

fwrite(&name, sizeof(name), 1, file);

这只会写入与指针大小相对应的字符数,通常为 4。

如果您要写出的大小是固定的(看起来 Java 代码需要 64 个字符),您需要以某种方式将该大小传递给Log().

在 C 语言中没有办法计算出(可能已经)作为第一个参数传递给Log()函数内部的数组的大小,这就是为什么必须明确说明的原因。

于 2012-04-16T14:49:23.670 回答
1

你的fwrite陈述看起来不对:

fwrite(&name, sizeof(name), 1, file);

你实际上想要这样的东西:

fwrite(name, sizeof(TCHAR), strlen(name) + 1, file);
于 2012-04-16T14:50:06.770 回答