用java实现fread(readint)

ruarlubt  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(291)

我正在尝试将一个在c++中读取二进制文件的程序转换为java。文件是用little endian写成的。

fread(n, sizeof (unsigned), 1, inputFile);

上面的c++代码段将1个整数读入整数变量“n”。
我现在用这个方法来完成同样的事情:

public static int readInt(RandomAccessFile inputStream) throws IOException {
    int retVal;
    byte[] buffer = new byte[4];
    inputStream.readFully(buffer);
    ByteBuffer wrapped = ByteBuffer.wrap(buffer);
    wrapped.order(ByteOrder.LITTLE_ENDIAN);
    retVal = wrapped.getInt();
    return retVal;
}

但这种方法有时在结果上与c示例有所不同。我无法确定文件的哪些部分导致此方法失败,但我知道确实如此。例如,当读取文件的一部分时,readint方法返回 543974774 但是c版本返回 1 .
有没有更好的方法来读取java中的小endian值?或者在我的实现中有什么明显的缺陷?任何帮助我理解哪里可能出错,或者我如何能够以更有效的方式阅读这些价值观的人都将不胜感激。
更新:我使用randomaccessfile是因为我经常需要randomaccessfile在java中提供的fseek功能

dvtswwa3

dvtswwa31#

543974774是,十六进制,206c6576。
这颗行星上没有一个终结点能把206c6576变成“1”。因此,问题是您没有读取您认为正在读取的内容:如果c代码正在读取4个字节(甚至是一个变量,未知的字节数)并将其转换为“1”,那么您的java代码读取的字节数就不相同—您的c代码和java代码不同步:在某个时刻,您的c代码读取的字节数为2,java代码读取4字节,反之亦然。
问题不在你的脑子里 readInt 方法-每次都做得很好。

相关问题