我正在努力将一段代码从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]
我将探索使用单个格式字符串来查看字符串中混合类型的影响。