Matlab和Fortran之间的数据解释

时间:2014-06-03 01:09:03

标签: matlab binary fortran

我有一些Fortran代码可以解释二进制文件。感谢另一个问题,我问我理解fortran代码是如何工作的,但我需要帮助将其更改为MATLAB代码。这是Fortran代码:

  IMPLICIT NONE

  DOUBLE PRECISION      SCALE

  CHARACTER*72          BLINE
  CHARACTER*72          DATA_FILE_FULL_NAME
  CHARACTER*6           DATA_FILE_NAME

  CHARACTER*4           CH4, CH4F
  REAL*4                RL4
  EQUIVALENCE          (RL4,CH4)

  CHARACTER*2           C2
  LOGICAL               LFLAG

  INTEGER*2             I2

  if(i2.eq.13881) LFLAG=.FALSE.

  c2='69'
  LFLAG=.TRUE.

  DATA_FILE_FULL_NAME='./'//DATA_FILE_NAME//'.DAT'

  OPEN(UNIT=20, FILE=DATA_FILE_FULL_NAME, ACCESS='DIRECT',
 .     RECL=72, status='OLD')
    READ(20,REC=1) BLINE
    CH4f=BLINE(7:10)
    call flip(4,lflag,ch4f,ch4)
    SCALE=RL4

  RETURN
  END  

c   ..................................................
    subroutine flip(n,lflag,ch1,ch2)
c   ..................................................

  integer*4        n, i
  character*(*)    ch1, ch2
  logical          lflag

  if(lflag) then
    do i=1,n
      ch2(i:i)=ch1(n-i+1:n-i+1)
    enddo
  else
    ch2=ch1
  endif

  return
  end   

所以基本上(我相信我理解正确)Fortran代码正在检查endianess并在机器和数据不匹配时翻转它。另外,数据存储在存储器中为CH4和RL4保留的位置,因此通过在定义CH4之后调用RL4,数据被简单地转换为REAL * 4类型而不是CHARACTER * 4类型。现在我需要弄清楚如何将其移植到Matlab中。我已经有能力读取原始数据,但是当我尝试各种形式的解释时,我总是得到错误的答案。到目前为止,我已经尝试过:

fid=fopen(LMK_file,'r');
BLINE=fread(fid, 72,'char=>char');
CH4=BLINE(7:10);
SCALE=single(CH4(1)+CH4(2)+CH4(3)+CH4(4));

SCALE=int8(CH4(1)+256*int8(CH4(2))+256^2*int8(CH4(3))+256^3*int8(CH4(4));
在MATLAB中

但两个都给了我同样错误的答案(这是有道理的,因为它做了几乎相同的事情)。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

对于正在寻找这个问题答案的其他人来说,这是我在评论中提供帮助时想出来的。

fid=fopen(LMK_file,'r');  %open the file for reading
IGNORE=fread(fid,6,'*char');  %ignore the first 6 bytes.  This could also be performed using fseek
SCALE=fread(fid,1,'*float32','b');  %reading in the scale value as a floating point 32 bit number. 

其中b表示文件的大字结尾。使用' * float32'选项,fread自动将接下来的4个字符解释为32位浮点数。

这将从给定文件返回正确的比例值。