不幸的是,没有标准unformatted
方法。但有些方法比其他方法更常见。
在我使用过的许多 Fortran 版本中,每个write
命令写入数据有多少字节的标头(通常是 unsigned int 32),然后是数据,然后重复标头值,以防您从后面读取。
根据您提供的值,您可能有这样的情况:
- uint32(记录1标头),可能是12。
- float32、float32、int32(您谈到的三个“其他值”)
- uint32(记录1标头,与第一个值相同)
- uint32(记录2标头,可能是512^3*4)
- 浮动32*512^3
- uint32(记录2头,与之前相同)
您可能需要检查字节序。
所以我建议你用hexdump程序打开该文件,检查字节0-3是否与字节16-19相同,以及字节20-23是否在数据末尾再次重复。
如果是这种情况,我将尝试检查字节序,看看这些值是小字节序还是大字节序,如果幸运的话,您将获得数据。
Note:我假设这三个其他值是有关数据的元数据,因此将位于文件的开头。如果情况并非如此,您可能会在最后得到它们。
Update:
在您的评论中,您写道您的数据以如下方式开头:
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 则以行优先存储数组。因此请记住,索引的顺序将会颠倒。
我知道如何用 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()