f77无格式二进制文件的内容

时间:2018-12-10 17:46:28

标签: c fortran fortran77

我有一个f77未格式化的二进制文件。 我知道该文件包含2个浮点数和一个长整数以及数据。 该文件的大小为536870940字节,其中应包括512 ^ 3个浮点数据值以及2个浮点和长整数。 512 ^ 3个浮点数据值组成536870912字节,剩下28个字节。

我的问题是我需要弄清楚28个字节的开始位置以及如何跳过此存储量,以便可以直接访问数据。

我更喜欢使用C来访问文件。

1 个答案:

答案 0 :(得分:2)

不幸的是,unformatted的含义没有标准。但是某些方法比其他方法更常见。

在我使用过的许多Fortran版本中,每个write命令都会写一个标题(通常为无符号int 32),该标题包含数据的字节数,然后是数据,然后在读取时重复标题值从后面。

根据您提供的值,可能是这样的:

  • uint32(记录1标头),可能是12。
  • float32,float32,int32(您提到的三个“其他值”)
  • uint32(record1标头,与第一个值相同)
  • uint32(record2标头,可能为512 ^ 3 * 4)
  • float32 * 512 ^ 3
  • uint32(record2标头,与之前相同)

您可能需要检查字节序。

因此,我建议您在hexdump程序中打开文件,并检查字节0-3是否与字节16-19相同,以及是否再次在数据末尾重复字节20-23。

如果是这种情况,我将尝试检查字节序,以查看值是小字节序还是大字节序,如果运气好的话,您将拥有自己的数据。

注意:我假设其他三个值是有关数据的元数据,因此将位于文件的开头。如果不是这种情况,您可以在结尾处添加它们。

更新

在您的评论中,您写道您的数据以这样的开头:

0C 00 00 00 XX XX XX XX XX XX XX XX XX XX XX XX 0C 00 00 00
^- header-^                                     ^-header -^
E8 09 FF 1F (many, many values) E8 09 FF 1F
^- header-^ ^--- your data ---^ ^-header -^

现在,我不知道如何在C语言中读取数据。我让您自己决定。您需要做的是跳过前24个字节,然后将数据读取为(可能是小端)4字节浮点值。您将剩下4个字节,不再需要。

重要提示: Fortran将数组存储为列主行,C afaik将其存储为行主行。因此请记住,索引的顺序将颠倒。

我知道如何在Python中阅读它:

from scipy.io import FortranFile
ff = FortranFile('data.dat', 'r', '<u4')
# read the three values you are not interested in
threevals = ff.read_record('<u4')
# read the data
data = ff.read_record('<f4')
ff.close()