問題描述
我使用以下 matlab 代碼創(chuàng)建了一個二進制文件:
I have created a binary file using the following matlab code:
x is an array of int32 numbers
n is the length of x
fid = fopen("binary_file.dat", "wb");
fwrite(fid, n, 'int32');
fwrite(fid, x, 'int32');
fclose(fid);
我可以使用下面的 C 代碼來讀取這個文件:
I can use the following C code to read this file:
fp = fopen("binary_file.dat", "rb");
int n;
fread(&n, 4, 1, fp);//read 4 bytes
int *x = new int[n];
for (int i = 0; i < n; i++)
{
int t;
fread(&t,4, 1,fp);//read 4 bytes
x[i] = t;
}
......
上面的 C 代碼可以讀取正確的結(jié)果.但是,我現(xiàn)在想用 JAVA 讀取這樣的二進制文件.我的代碼如下所示:
The above C code can read correct results. However, I now want to read such binary file in JAVA. My code is shown as follows:
DataInputStream data_in = new DataInputStream(
new BufferedInputStream(
new FileInputStream(
new File("binary_file.dat"))));
while(true)
{
try {
int t = data_in.readInt();//read 4 bytes
System.out.println(t);
} catch (EOFException eof) {
break;
}
}
data_in.close();
它確實在 n+1 次循環(huán)后終止,但結(jié)果不正確.誰能幫幫我.非常感謝!
It DOES terminates after n+1 loops, but the results are not correct. Can anybody help me out. Thanks very much!
推薦答案
我猜這是字節(jié)序問題,即你的二進制文件寫成小端整數(shù)(可能是因為您使用的是 Intel 或類似的 CPU).
As I was guessing it is an endianness issue, i.e. your binary file is written as little-endian integers (probably, because you are using a Intel or similar CPU).
然而,Java 代碼正在讀取大端整數(shù),無論??它在什么 CPU 上運行.
The Java code, however, is reading big-endian integers, no matter what CPU it is running on.
為了顯示問題,以下代碼將讀取您的數(shù)據(jù)并將整數(shù)顯示為字節(jié)序轉(zhuǎn)換前后的十六進制數(shù).
To show the problem the following code will read your data and display the integers as hex number before and after endianness conversion.
import java.io.*;
class TestBinaryFileReading {
static public void main(String[] args) throws IOException {
DataInputStream data_in = new DataInputStream(
new BufferedInputStream(
new FileInputStream(new File("binary_file.dat"))));
while(true) {
try {
int t = data_in.readInt();//read 4 bytes
System.out.printf("%08X ",t);
// change endianness "manually":
t = (0x000000ff & (t>>24)) |
(0x0000ff00 & (t>> 8)) |
(0x00ff0000 & (t<< 8)) |
(0xff000000 & (t<<24));
System.out.printf("%08X",t);
System.out.println();
}
catch (java.io.EOFException eof) {
break;
}
}
data_in.close();
}
}
如果您不想手動"更改字節(jié)順序,請參閱此問題的答案問題:
將小端文件轉(zhuǎn)換為大端
If you don't want to do change endianness "manually", see answers to this
question:
convert little Endian file into big Endian
這篇關(guān)于如何使用 JAVA 讀取 C/Matlab 創(chuàng)建的二進制文件的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!