我有一个f77未格式化的二进制文件。 我知道该文件包含2个浮点数和一个长整数以及数据。 该文件的大小为536870940字节,其中应包括512 ^ 3个浮点数据值以及2个浮点和长整数。 512 ^ 3个浮点数据值组成536870912字节,剩下28个字节。
我的问题是我需要弄清楚28个字节的开始位置以及如何跳过此存储量,以便可以直接访问数据。
我更喜欢使用C来访问文件。
答案 0 :(得分:2)
不幸的是,unformatted
的含义没有标准。但是某些方法比其他方法更常见。
在我使用过的许多Fortran版本中,每个write
命令都会写一个标题(通常为无符号int 32),该标题包含数据的字节数,然后是数据,然后在读取时重复标题值从后面。
根据您提供的值,可能是这样的:
您可能需要检查字节序。
因此,我建议您在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()