解析二进制文件中的结构内容

时间:2010-05-26 18:36:15

标签: c# .net binary parsing fortran

使用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),但大多数文件会小得多......

2 个答案:

答案 0 :(得分:1)

读取这样的文件的一种方法是逐个记录(例如,读取长度字节,然后读取数据块,构建记录列表,这只是字节数组)。然后将记录集合传递给进一步的解析例程。

但是,如果您使用的是4.0,则文件映射有new class,效率更高,但与ReadAllBytes类似。

如果您正在使用ReadAllBytesMemoryMappedFile,最好先通过解析所有记录长度,在大型二进制文件中构建内存中的“索引”。如果您只需要某些记录,这将特别有用。

答案 1 :(得分:0)

不要遍历字节,而是查看System.IO.BinaryReader。将文件作为FileStream打开,将其包装在BinaryReader中,您可以直接从中读取原始类型,并使用流指针跟踪您在blob中的偏移量。您可能必须自己考虑字节序和自定义类型,可能会在其读取单个字节的方法之上构建自己的BinaryReader扩展方法。

如果确实需要字节数组中的数据,如果先将数组包装在BinaryReader中,仍然可以使用MemoryStream

如果文件很大,我就会避开File.ReadAllBytesFileStream应该为您缓冲,而Stephen建议使用内存映射文件听起来像是一种更复杂(可能更有效)的替代方案,特别是如果您需要为格式化进行第二次传递。