从用C编写的文件中读取Java

时间:2012-04-16 14:46:38

标签: java c file binary

我有一个用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 个答案:

答案 0 :(得分:1)

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

size_t len = strlen(name);
write_int(file, len);
fwrite(&name, len, sizeof(char), file);

答案 1 :(得分:1)

你必须小心打字&#34; int&#34;。

java中的

int总是32位,而在C中则不是这样。在C中它可能是16,32,64位

答案 2 :(得分:1)

这是错误的:

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

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

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

C中没有办法计算出(可能已经)作为Log()的第一个参数从函数中传递的数组的大小,这就是为什么你必须明确它。 / p>

答案 3 :(得分:1)

您的fwrite声明看起来不正确:

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

你真的想要这样的东西:

fwrite(name, sizeof(TCHAR), strlen(name) + 1, file);