【问题标题】:Write binary file in Java用Java编写二进制文件
【发布时间】:2013-07-12 13:28:59
【问题描述】:

在将工作中的MATLAB sn-p 转换为相应的JAVA 时,我遇到了很多问题。

MATLAB 中,它的工作原理如下:

fid = fopen('test.wnd','w');
fwrite(fid, -99, 'int16');
fwrite(fid, 7, 'int16');
fwrite(fid, 92, 'int32');
fwrite(fid, 3, 'int32');
fwrite(fid, 75.0, 'float32');
fwrite(fid, 75.0, 'float32');
fwrite(fid, 3.0, 'float32');
fwrite(fid, 2048, 'int32');
fwrite(fid, 8.0, 'float32');
fwrite(fid, 0, 'float32');
fwrite(fid, 0, 'float32');
fwrite(fid, 340.2, 'float32');
fwrite(fid, 0, 'int32');
fwrite(fid, 12, 'int32');
fwrite(fid, 3, 'int32');
fwrite(fid, 3, 'int32');
fwrite(fid, 0, 'float32');
fwrite(fid, 0, 'float32');
fwrite(fid, 113.4, 'float32');
fwrite(fid, 0, 'float32');
fwrite(fid, 0, 'float32');
fwrite(fid, 27.72, 'float32');
fwrite(fid, 12, 'float32');
fwrite(fid, 340.2, 'float32');

Scale = [1.0 .8 .5];
Offset = [8.0 0 0];

v = zeros(3*3,1);

for it = 1:nt
    cnt = 1;
    for iz = 1:nz
        for iy = y_ix
            for k=1:nffc
                v(cnt) =  ((velocity(it,k,iy,iz) - Offset(k))/Scale(k)*1000);
                cnt = cnt + 1;                
            end %for k
        end %iy
    end % iz 

    fwrite( fid_wnd, v, 'int16' );

end %it
fclose(fid);

因此,在 JAVA 中,我尝试了这个:

DataOutputStream dos = new DataOutputStream(new FileOutputStream("C:/Users/fperrone/Desktop/test.wnd"));
dos.writeShort(-99);
dos.writeShort(7);
dos.writeInt(92);
dos.writeInt(3);        
dos.writeFloat((float)75.0);
dos.writeFloat((float)75.0);
dos.writeFloat((float)2.4);
dos.writeInt(2048);
dos.writeFloat((float)8.0);
dos.writeFloat((float)0);
dos.writeFloat((float)0);
dos.writeFloat((float)340.2);
dos.writeInt(0);
dos.writeInt(67);
dos.writeInt(3);
dos.writeInt(3);
dos.writeFloat((float)0);
dos.writeFloat((float)0);
dos.writeFloat((float)113.4);
dos.writeFloat((float)0);
dos.writeFloat((float)0);
dos.writeFloat((float)27.72);
dos.writeFloat((float)12);
dos.writeFloat((float)340.2);
double[] Offset = {8.0, 0.0, 0.0};
double[] Scale = {1.0, .8, .5};
short v[] = new short[9];
        for(int it = 0; it < 4096; ++it){
            for(int comp = 0; comp < 3; ++comp){
                int count = 0;
                for(int iy = 0; iy < 3; ++iy){
                    for(int iz = 0; iz < 3; ++iz){
                        v[count] = (short) ((test[it][comp][iy][iz] - Offset[comp])/Scale[comp]*1000);
                        dos.writeShort(v[count]);
                        count += 1;
                    }
                }
            }           
        }       
        dos.close();

关键是,当我将JAVA 输出与二进制文件适用的软件链接时,该软件不会读取任何信息,而MATLAB 输出却可以按预期完美读取。

我错过了什么?

【问题讨论】:

  • 您是否比较了 Java 生成的二进制文件和 MATLAB 生成的二进制文件?可能是字节顺序还是一些这样的恶作剧?
  • 一个问题可能是你使用 writeInt() 而不是 writeShort() 用于第一个 '7'(matlab 中的 int16)
  • 这是一个错字,我编辑了。
  • @Shark:这可能是一个提示!
  • Java会写big-endian Integer/Short(高位字节优先),MATLAB是做什么的???

标签: java matlab io binaryfiles


【解决方案1】:

由于你没有在matlab程序的fopen()或者fwrite()中指定“机器格式”,所以默认使用'native'系统字节序。

在 Matlab 中使用“machineformat”字段创建文件时,您需要指定二进制格式。

fileID = fopen(文件名、权限、machinefmt、encodingIn) fwrite(fileID, A, precision, skip, machineformat)

更多信息在这里: http://www.mathworks.com/help/matlab/ref/fopen.html http://www.mathworks.com/help/matlab/ref/fwrite.html

要从 java 程序中正确读取,您需要这样做:fid = fopen('test.wnd','w', 's');

【讨论】:

    猜你喜欢
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2011-12-07
    • 2015-11-29
    • 2017-10-20
    相关资源
    最近更新 更多