Matlab中的二进制文件写/读操作

时间:2015-02-24 16:06:13

标签: matlab file binary read-write

我正在尝试将一些2D坐标写入二进制文件。但是,我从已经写入的文件中读取的内容与原始数据完全不同。详情请见这里。

例如,我有45(X,Y)点。 X和Y都是小于600的整数。模拟需要将每个字节存储为两个字节(8位),并保留每个字节的2个高位(对于X,保留位由.mrk填充,即1或2;对于Y,只需使用0代替)。在这种情况下,14位二进制数能够代表最大值16383.我用几种方式写数据:

in_tmp是由点号(.nm),点保留标记(.mrk)和点坐标(.coor)组成的结构

for i=1:in_tmp.nm
    x1 = dec2bin(in_tmp.coor(i,1));
    y1 = dec2bin(in_tmp.coor(i,2));
      t1 = in_tm.mrk(i);
      if(t1==1)
          t2 = '01';
          t2b = 1;
      elseif(t1==2)
          t2 = '10';
          t2b = 2;
      end
      lenx = 16-length(x1);
      leny = 16-length(y1);
      x1hl = strcat(t2, '00000000000000');   % High and low
      y1hl = '0000000000000000';
      x1a = strcat(x1hl(1:lenx), num2str(x1));
      y1a = strcat(y1hl(1:leny), num2str(y1));
      y1a(1:2) = '00';
%     x1b = in_tmp.coor(i,1);
%     y1b = in_tmp.coor(i,2);
%     fwrite(fp1, t2b, 'ubit2');
%     fwrite(fp1, x1b, 'ubit14');
%     
%     fwrite(fp1, 0, 'ubit2');
%     fwrite(fp1, y1b, 'ubit14');
      fwrite(fp1, bin2dec(x1a), 'uint16');
      fwrite(fp1, bin2dec(y1a), 'uint16');
%     fwrite(fp1, bin2dec(x1a(1:8)), 'uint8');
%     fwrite(fp1, bin2dec(x1a(9:end)), 'uint8');
%     fwrite(fp1, bin2dec(y1a(1:8)), 'uint8');
%     fwrite(fp1, bin2dec(y1a(9:end)), 'uint8');
%     x1c = in_tmp.coor(i,1);
%     y1c = in_tmp.coor(i,2);
%     
%     x1hex = dec2hex(x1c);
%     y1hex = dec2hex(y1c);
%     if(length(x1hex)>2)
%         x1h = x1hex(1:end-2);
%         x1l = x1hex(end-1:end);
%     else
%         x1h = dec2hex(0);
%         x1l = x1hex;
%     end
%     
%     tx1h = dec2bin(hex2dec(x1h));
%     l1 = length(tx1h);
%     bin0 = dec2bin(128);    % '10000000'
%     if(t1==1)
%         bin0(end-l1+1:end) = tx1h;
%         bin0(1)=0;
%         bin0(2)=1;
%         
%     elseif(t1==2)
%         bin0(end-l1+1:end) = tx1h;
%     end
%     x1h = bin2dec(tx1h);
%     
%         if(length(y1hex)>2)
%         y1h = y1hex(1:end-2);
%         y1l = y1hex(end-1:end);
%     else
%         y1h = dec2hex(0);
%         y1l = y1hex;
%     end
%     fwrite(fp1, x1h, 'uint8');
%     fwrite(fp1, hex2dec(x1l), 'uint8');
%     fwrite(fp1, hex2dec(y1h), 'uint8');
%     fwrite(fp1, hex2dec(y1l), 'uint8');
end

我读它的方式

    for i=1:mt.nm              % nm points.
        mred(i,6) = fread(fp1, 1, 'uint8');       % Raw X coordinates.
        mred(i,7) = fread(fp1, 1, 'uint8');       % upper 2 bits are reserved info.
        tmpx = [dec2bin(mred(i,6)), dec2bin(mred(i,7))];
        if(length(tmpx)==16)
            mred(i,4) = bin2dec(tmpx(1:2));       % Real Mark.
            mred(i,1) = bin2dec(tmpx(3:end));     % Real X.
        elseif(length(tmpx)==15)
            mred(i,4) = bin2dec(tmpx(1));         % Real Type.
            mred(i,1) = bin2dec(tmpx(2:end));     % Real X.
        else
            mred(i,4) = bin2dec(tmpx(1:2));       % Type unknown.
            mred(i,1) = bin2dec(tmpx(3:end));     % Real X.
        end       
          mred(i,8) = fread(fp1, 1, 'uint8');       % Y coordinates.
          mred(i,9) = fread(fp1, 1, 'uint8');       % upper 2 bits are reserved.
          tmpy = [dec2bin(mred(i,8)), dec2bin(mred(i,9))];
          if(length(tmpy)==16)
              mred(i,10) = bin2dec(tmpy(1:2));      % Real reserved.
              mred(i,2) = bin2dec(tmpy(3:end));     % Real Y.
          elseif(length(tmpy)==15)
              mred(i,10) = bin2dec(tmpy(1));        % Real reserved.
              mred(i,2) = bin2dec(tmpy(2:end));     % Real Y.
          else
              mred(i,10) = -1;                      % Reserved unknown.
              mred(i,2) = bin2dec(tmpy);            % Real Y.
          end               
    end

read()函数适用于通过C ++实现的给定软件。该软件以这种格式生成坐标系列。然后,我准备一个read()来获取C ++软件生成的二进制文件中的信息。然后,我想以该格式使用Matlab实现write(),但是read()无法获得我写入二进制文件的内容。有人帮忙吗?感谢。

1 个答案:

答案 0 :(得分:0)

问题可能(至少部分)是一个endian问题。 在intel架构(小端)上,读取两个字节为uint8,然后附加二进制表示,通常不会给你带来与读取两个字节uint16相同的结果。

以下脚本说明了如何交换两个uint8的顺序。

我更改了一些变量名称,使可读性更加简洁。

% declare an input int and the header (in binary string rep)

v = 68;
t2 = '01';

% write to file

x1 = dec2bin(v);
lenx = 16-length(x1);
x1hl = strcat(t2, '00000000000000');   % High and low
x1a = strcat(x1hl(1:lenx), num2str(x1));

% x1a = 0100000001000100

fp1=fopen('temp','w+');
fwrite(fp1, bin2dec(x1a), 'uint16');

% read the file

frewind(fp1);
vtest = fread(fp1, 1, 'uint16');       % upper 2 bits are reserved info.
dec2bin(vtest)

% ans = 100000001000100

% now read *two* bytes as two uint8

frewind(fp1);

byte1 = fread(fp1, 1, 'uint8');       % Raw X coordinates.
byte2 = fread(fp1, 1, 'uint8');       % upper 2 bits are reserved info.
tmpx = [dec2bin(byte2) dec2bin(byte1)]; % <-- swap the order

% tmpx = 10000001000100

或者只是将整个2个字节作为uint16读取并从那里开始工作。