我有一个f77非格式化的二进制文件。我知道这个文件包含2个浮点数和一个长整数以及数据。该文件的大小为536870940字节,其中应包括512^3个浮点型数据值以及2个浮点型和长整型。512^3浮点型数据值组成536870912个字节,剩下28个字节。
我的问题是,我需要弄清楚28个字节从哪里开始,以及如何跳过这个存储量,以便我可以直接访问数据。
我更喜欢使用C来访问这个文件。
发布于 2018-12-11 08:35:26
不幸的是,unformatted
的含义并没有标准。但有些方法比其他方法更常见。
在我使用过的许多Fortran版本中,每个write
命令都写入一个标头(通常是无符号的int32),表示数据有多少字节,然后写入数据,然后重复标头的值,以防您从后面读取数据。
根据您提供的值,您可能具有如下内容:
报头)
您可能需要检查字节顺序。
因此,我建议您在一个十六进制转储程序中打开该文件,并检查字节0-3是否与字节16-19相同,以及字节20-23是否在数据末尾再次重复。
如果是这种情况,我将尝试检查endianness,看看值是小端还是大端,幸运的是,您将拥有自己的数据。
注意:我假设这另外三个值是关于数据的元数据,因此应该在文件的开头。如果不是这样,你可能会在最后得到它们。
更新:
在你的评论中,你写道你的数据是这样开始的:
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()
https://stackoverflow.com/questions/53710955
复制相似问题