首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >f77非格式化二进制文件的内容

f77非格式化二进制文件的内容
EN

Stack Overflow用户
提问于 2018-12-11 01:46:28
回答 1查看 155关注 0票数 0

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2018-12-11 08:35:26

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

在我使用过的许多Fortran版本中,每个write命令都写入一个标头(通常是无符号的int32),表示数据有多少字节,然后写入数据,然后重复标头的值,以防您从后面读取数据。

根据您提供的值,您可能具有如下内容:

  • uint32(record1报头),可能12个。about)
  • uint32(record1报头,和第一个value)
  • uint32(record2报头一样,可能是512^3*4)
  • float32*512^3
  • uint32(record2报头,也可能是
  • float32,float32,int32 (你提到的三个'other values‘

报头)

您可能需要检查字节顺序。

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

如果是这种情况,我将尝试检查endianness,看看值是小端还是大端,幸运的是,您将拥有自己的数据。

注意:我假设这另外三个值是关于数据的元数据,因此应该在文件的开头。如果不是这样,你可能会在最后得到它们。

更新:

在你的评论中,你写道你的数据是这样开始的:

代码语言:javascript
复制
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中阅读:

代码语言:javascript
复制
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()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53710955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档