Python Struct使用C结构解压缩像C fread一样?

时间:2013-11-27 15:55:28

标签: python c numpy struct binary

我正在努力将一段代码从C(最初是Fortran)移植到python来解压缩二进制文件的头部。

C是:

fread(&hdr, hdrSize, 1, modelFile);

alb    = hdr.fd[0];
skrc   = hdr.fd[2];
taud   = hdr.fd[16];
djul   = hdr.fd[40];
deljul = hdr.fd[41];
n4     = hdr.id[3];
n5     = hdr.id[4];
n24    = hdr.id[5];
jdisk  = hdr.id[11];
k4out  = hdr.id[16];
j5     = hdr.id[39];

该文件是使用Fortran编写的,例如,alb定义为(F10.2),n4定义为(I10)。

我尝试同时使用struct模块,numpy.fromfile()numpy.fromstring()。我知道总标题大小,所以使用numpy.fromstring()我可以读取二进制文件(open(file, 'r+b')并生成一个比预期长得多的数组 - 这是回填0.0,我相信如果标题有意义是固定大小,填充数据较小。

struct模块是否可以像fread()那样访问数据?在C代码中,我相信.fd[0]表示我们正在查看结构0?如果是这样,那格式是否可以在Python中重复?

编辑: 我无法在C代码中找到.id或.fd,但原始的fortran将它们定义为

 REAL*4    FD(80)          
 INTEGER*4 ID(40) 

从Fortran到C的其余端口基本上是逐字的,所以我认为声明是相同的。

EDIT2: 以下似乎有效 - 因为变量值是合乎逻辑的。这是使用struct模块。

with open(sys.argv[1], 'r+b') as l:
    headdata = l.read(HEAD_BYTES)
    fd_arr = struct.unpack('f'*80, headdata[0:320])
    print fd_arr[0]
    print fd_arr[2]
    print fd_arr[16]
    print fd_arr[40]
    print fd_arr[41]
    id_arr = struct.unpack('i'*40, headdata[320:480])
    print id_arr[3]
    print id_arr[4]
    print id_arr[5]
    print id_arr[11]
    print id_arr[16]
    print id_arr[39]

我将探索使用单个格式字符串来查看字符串中混合类型的影响。

0 个答案:

没有答案