当前位置: 首页 > 面试题库 >

如何使用JAVA读取C / Matlab创建的二进制文件

温峻熙
2023-03-14
问题内容

我使用以下matlab代码创建了一个二进制文件

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代码读取此文件:

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代码可以读取正确的结果。但是,我现在想在JAVA中读取这样的二进制文件。我的代码如下所示:

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次循环后终止,但结果不正确。有人可以帮我吗。非常感谢!


问题答案:

正如我所猜测的那样,这是一个字节序问题,即您的二进制文件被写为低字节序的整数(可能是因为您使用的是Intel或类似的CPU)。

但是,无论Java代码运行在哪个CPU上,它都在读取大端整数。

为了显示该问题,以下代码将读取您的数据,并在字节序转换之前和之后将整数显示为十六进制数字。

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();
  }
}

如果您不想“手动”更改字节序,请参阅以下问题的答案:将小字节序
文件转换为大字节序



 类似资料:
  • 问题内容: 我在C#.net中有一个程序,它使用写入1个整数和3个字符串到文件中。 现在,我正在用Java编程(对于Android,这是Java的新手),我必须访问以前使用C#写入文件的数据。 我尝试使用和,但无法获得正确的结果。我通常会得到: java.io.UTFDataFormatException:字节21附近的输入格式错误 或者和我得到的是错误的… 这样做的正确方法是什么? 问题答案:

  • 问题内容: 我有一个较长的无符号整数文件(每个64位,0.47GB文件),需要读取并存储在数组中。经过一番思考之后,由于Java中的所有内容都已签名(请纠正我,请纠正我),因此我长时间使用了该类型,我想不出更好的选择了。无论如何,仅需对数组进行排序,因此原始数字的精确值并不是最重要的。我们应该测量排序算法的效率,仅此而已。但是,当我实际要读取文件时(在下面的代码中),我遇到了砖墙。 它会一直持续下

  • 我试图在matlab中读取一个数组浮点,存储在二进制文件中。最初的文件是用C++代码创建的,通过内存映射技巧。 我想要注意的是,如果我写了uint8_t(或未签名的char)数组,那么从matlab读取这个文件就成功了。我在MATLAB中做错了什么? 我的系统-64位Ubuntu 13.04,C++编译器-gcc 4.8,MATLAB-2013A

  • 问题内容: 我发现用Python读取二进制文件特别困难。你能帮我个忙吗?我需要读取此文件,在Fortran 90中,该文件很容易被读取 详细而言,文件格式为: 如何使用Python阅读?我尝试了一切,但没有成功。我是否有可能在python中使用f90程序,读取此二进制文件,然后保存需要使用的数据? 问题答案: 读取二进制文件内容,如下所示: 然后使用struct.unpack “解压缩”二进制数据

  • 问题内容: 我对Go完全陌生,我试图读取一个二进制文件,一次读取一个字节或几个字节。该文档并没有多大帮助,我找不到任何教程或简单示例(顺便说一句,Google如何给他们的语言提供这样一个难以理解的名称?)。基本上,如何打开文件,然后将一些字节读入缓冲区?有什么建议吗? 问题答案: 要处理文件,该软件包是您的朋友: 在过去的文件是如何打开更多的控制,看到代替(DOC) 。 为了读取文件,有很多方法。

  • 本文向大家介绍C#读取二进制文件方法分析,包括了C#读取二进制文件方法分析的使用技巧和注意事项,需要的朋友参考一下 本文较为详细的分析了C#读取二进制文件方法。分享给大家供大家参考。具体分析如下: 当想到所有文件都转换为 XML时,确实是一件好事。但是,这并非事实。仍旧还有大量的文件格式不是XML,甚至也不是ASCII。二进制文件仍然在网络中传播,储存在磁盘上,在应用程序之间传递。相比之下,在处理