我有一个 f77 未格式化的二进制文件。 我知道该文件包含 2 个 float 和一个长整数以及数据。 该文件的大小为 536870940 字节,其中应包括 512^3 个 float 据值以及 2 个 float 和长整数。 512^3 个 float 据值构成 536870912 个字节,还剩下 28 个字节。
我的问题是我需要弄清楚 28 个字节从哪里开始以及如何跳过这个存储量以便我可以直接访问数据。
我更喜欢使用 C 来访问文件。
最佳答案
不幸的是,unformatted
的含义没有标准。但有些方法比其他方法更常见。
在我使用过的许多 Fortran 版本中,每个 write
命令都会写入一个 header (通常是 unsigned int 32),其中包含数据的字节数,然后是数据,然后重复 header 值以防万一'从后面读。
根据您提供的值,您可能有这样的东西:
- uint32(记录 1 header ),可能是 12。
- float32、float32、int32(您谈到的三个“其他值”)
- uint32(record1 header ,与第一个值相同)
- uint32(record2 header, probably 512^3*4)
- float32*512^3
- uint32(record2 header,同前)
您可能需要检查字节顺序。
所以我建议你用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()
关于f77 未格式化二进制文件的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53710955/