使用C#,我需要读取使用FORTRAN创建的压缩二进制文件。该文件以“Unformatted Sequential”格式存储,如此处所述(大约在“Unformatted Sequential Files”部分页面的下半部分):
http://www.tacc.utexas.edu/services/userguides/intel8/fc/f_ug1/pggfmsp.htm
从URL中可以看出,该文件被组织成130个字节或更少的“块”,并包含围绕每个块的2个长度字节(由FORTRAN编译器插入)。
因此,我需要找到一种有效的方法来解析实际的文件有效负载,而不是插入编译器的格式。
一旦我从文件中提取了实际的有效负载,我就需要将其解析为不同的数据类型。那将是下一个练习。
我的第一个想法是使用File.ReadAllBytes
将整个文件篡改成一个字节数组。然后,只需遍历字节,跳过格式化并将实际数据传输到第二个字节数组。
最后,第二个字节数组应该包含实际文件内容减去所有格式,然后我需要回过头来获取我需要的内容。
由于我对C#还不熟悉,我认为可能有一种更好,更可接受的解决方法。
另外,如果它有用,这些文件可能相当大(比如30MB),但大多数文件会小得多......
答案 0 :(得分:1)
读取这样的文件的一种方法是逐个记录(例如,读取长度字节,然后读取数据块,构建记录列表,这只是字节数组)。然后将记录集合传递给进一步的解析例程。
但是,如果您使用的是4.0,则文件映射有new class,效率更高,但与ReadAllBytes
类似。
如果您正在使用ReadAllBytes
或MemoryMappedFile
,最好先通过解析所有记录长度,在大型二进制文件中构建内存中的“索引”。如果您只需要某些记录,这将特别有用。
答案 1 :(得分:0)
不要遍历字节,而是查看System.IO.BinaryReader
。将文件作为FileStream
打开,将其包装在BinaryReader
中,您可以直接从中读取原始类型,并使用流指针跟踪您在blob中的偏移量。您可能必须自己考虑字节序和自定义类型,可能会在其读取单个字节的方法之上构建自己的BinaryReader
扩展方法。
如果确实需要字节数组中的数据,如果先将数组包装在BinaryReader
中,仍然可以使用MemoryStream
。
如果文件很大,我就会避开File.ReadAllBytes
。 FileStream
应该为您缓冲,而Stephen建议使用内存映射文件听起来像是一种更复杂(可能更有效)的替代方案,特别是如果您需要为格式化进行第二次传递。