在 java 中实现 fread (readInt)
Implement fread (readInt) in java
我正在尝试将读取二进制文件的 C++ 程序转换为 java。该文件是小端格式。
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 方法 returns 543974774
但 C++ 版本 returns 1
.
有没有更好的方法来读取 Java 中的小端值?还是我的实施存在一些明显的缺陷?任何帮助理解我可能出错的地方,或者我如何才能以更有效的方式阅读这些值的任何帮助将不胜感激。
更新:
我正在使用 RandomAccessFile,因为我经常需要 RandomAccessFile 在 java
中提供的 fseek 功能
543974774 是十六进制的 206C6576。
地球上没有将 206C6576 变为“1”的字节顺序。因此,问题是您没有阅读您认为正在阅读的内容:如果 C 代码正在读取 4 个字节(或者甚至是一个变量,未知字节数)并将其转换为“1”,那么您的 java 代码读取的字节不相同 - 您的 C 代码和 java 代码不同步:在某些时候,您的 C 代码读取了 2 个字节,而您的 java 代码读取了4 个字节,反之亦然。
问题不在您的 readInt
方法中 - 每次都能正确完成工作。
我正在尝试将读取二进制文件的 C++ 程序转换为 java。该文件是小端格式。
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 方法 returns 543974774
但 C++ 版本 returns 1
.
有没有更好的方法来读取 Java 中的小端值?还是我的实施存在一些明显的缺陷?任何帮助理解我可能出错的地方,或者我如何才能以更有效的方式阅读这些值的任何帮助将不胜感激。
更新: 我正在使用 RandomAccessFile,因为我经常需要 RandomAccessFile 在 java
中提供的 fseek 功能543974774 是十六进制的 206C6576。
地球上没有将 206C6576 变为“1”的字节顺序。因此,问题是您没有阅读您认为正在阅读的内容:如果 C 代码正在读取 4 个字节(或者甚至是一个变量,未知字节数)并将其转换为“1”,那么您的 java 代码读取的字节不相同 - 您的 C 代码和 java 代码不同步:在某些时候,您的 C 代码读取了 2 个字节,而您的 java 代码读取了4 个字节,反之亦然。
问题不在您的 readInt
方法中 - 每次都能正确完成工作。