Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从二进制文件的结构中解析内容_C#_.net_Binary_Parsing_Fortran - Fatal编程技术网

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

C# 从二进制文件的结构中解析内容,c#,.net,binary,parsing,fortran,C#,.net,Binary,Parsing,Fortran,使用C#,我需要读取使用FORTRAN创建的压缩二进制文件。文件以“未格式化顺序文件”格式存储,如下所述(在“未格式化顺序文件”部分中,大约位于页面的一半): 从URL中可以看到,文件被组织成130字节或更少的“块”,每个块周围包含2个长度字节(由FORTRAN编译器插入) 因此,我需要找到一种有效的方法来解析实际的文件负载,使其远离编译器插入的格式 一旦我从文件中提取了实际的负载,我就需要将其解析为不同的数据类型。这将是下一个练习 我的第一个想法是使用file.ReadAllBytes将整个

使用C#,我需要读取使用FORTRAN创建的压缩二进制文件。文件以“未格式化顺序文件”格式存储,如下所述(在“未格式化顺序文件”部分中,大约位于页面的一半):

从URL中可以看到,文件被组织成130字节或更少的“块”,每个块周围包含2个长度字节(由FORTRAN编译器插入)

因此,我需要找到一种有效的方法来解析实际的文件负载,使其远离编译器插入的格式

一旦我从文件中提取了实际的负载,我就需要将其解析为不同的数据类型。这将是下一个练习

我的第一个想法是使用
file.ReadAllBytes
将整个文件压缩成一个字节数组。然后,只需迭代字节,跳过格式化并将实际数据传输到第二个字节数组

最后,第二个字节数组应该包含实际的文件内容减去所有格式,然后我需要返回以获得所需的内容

由于我对C#还相当陌生,我认为可能有一种更好、更被接受的方法来解决这个问题


此外,如果有帮助的话,这些文件可能相当大(比如30MB),但大多数都会小得多…

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

但是,如果您使用的是4.0,则有一个用于文件映射的方法,该方法效率更高,但工作方式与
ReadAllBytes
类似


如果您使用的是
ReadAllBytes
MemoryMappedFile
,那么最好先解析所有记录长度,将内存中的“索引”构建到大型二进制文件中。如果您只需要某些记录,这一点尤其有用。

请查看
System.IO.BinaryReader
,而不是遍历字节。以
文件流
的形式打开文件,将其包装在
二进制读取器
中,您可以直接从中读取基元类型,流指针会跟踪到blob中的偏移量。您可能需要自己考虑endianness和自定义类型,可能需要在读取单个字节的方法之上为
BinaryReader
构建自己的扩展方法

如果确实需要字节数组中的数据,如果先将数组包装在
内存流中,则仍然可以使用
binarydreader


对于这么大的文件,我会避开
File.ReadAllBytes
FileStream
应该为您提供缓冲区,Stephen关于使用内存映射文件的建议听起来是一个更复杂(可能更高效)的替代方案,尤其是当您需要再次进行格式化时。

谢谢。我发现直接用BinaryReader处理这个问题的问题是数据被长度标记污染了(如原始文章的URL所述)。因此,我不能简单地开始读取我的原语,因为长度标记将沿流指针向上移动。因此,首先清除长度标记的数据,然后在第二步中进行处理似乎更干净。然而,这确实意味着要先把整个事情记下来。你们有并没有看到一个简单的方法来避开长度标记并在一次通过中使用BinaryReader?啊,我明白了。好了,现在您已经有了生成未受污染数据的代码,而不是使用位转换器,您可以从每个数组构造一个MemoryStream,它解决了数组指针问题(MemoryStream有一个用于包装现有数组的构造函数,而不是分配自己的数组)。然后将MemoryStream包装在BinaryReader中。啊,现在看起来很有希望(MemoryStream包装在BinaryReader中)。让我看看我能做些什么。谢谢,谢谢。根据您的评论,我编写了一些代码,将文件加载到字节数组中,并生成第二个干净的字节数组(没有长度标记)。我现在正试图使用BitConverter将其解析为各种标量值,尽管这看起来有点难看,因为我需要在转换数组时将自己的指针保存到数组中。假设我继续使用字节数组,是否有更好的方法从中获取各种标量?哦,我没有使用4.0…可以将字节数组包装到
内存流中
并使用
二进制读取器
BinaryReader
会记住自己的位置,因此您不需要这样做。