用Java编写二进制文件

用Java编写二进制文件,java,matlab,io,binaryfiles,Java,Matlab,Io,Binaryfiles,在将一个正常工作的MATLAB代码片段翻译成相应的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, 'float

在将一个正常工作的
MATLAB
代码片段翻译成相应的
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();
DataOutputStream dos=newdataoutputstream(newfileoutputstream(“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);
双[]偏移量={8.0,0.0,0.0};
双[]刻度={1.0,8,5};
短v[]=新短[9];
for(int it=0;it<4096;+it){
对于(int comp=0;comp<3;++comp){
整数计数=0;
对于(int-iy=0;iy<3;++iy){
对于(int-iz=0;iz<3;++iz){
v[count]=(短)((测试[it][comp][iy][iz]-偏移量[comp])/标度[comp]*1000);
dos.writeShort(v[count]);
计数+=1;
}
}
}           
}       
dos.close();
关键是,当我将
JAVA
输出与二进制文件所用的软件链接时,该软件不会读取任何信息,因此
MATLAB
输出的读取效果与预期一样完美


我遗漏了什么?

由于您没有在matlab程序的fopen()或fwrite()中指定“机器格式”,因此默认情况下,它将使用“本机”系统字节顺序

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

fileID=fopen(文件名、权限、机器代码、编码) fwrite(文件ID、A、精度、跳过、机器格式)

更多信息请点击此处:


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

您是否比较了Java结果二进制和MATLAB结果二进制?可能是endianness或类似的恶作剧吗?一个问题是,如果第一个“7”(matlab中的int16)的writeShort()是一个拼写错误,那么您可能会使用writeInt()。@Shark:这可能是一个提示!Java将编写big-endian Integer/Short(首先是高阶字节),MATLAB做什么???