c# - 一般读取格式正确的二进制文件

标签 c# c++ file binary

我正在尝试将游戏 map /模型文件的内容读入程序,以便编写一个小型模型查看器并测试一些 DirectX 功能。模型/ map 文件格式本质上是分块的,我知道这些文件的格式。我可以通过解析各个 block 来轻松读取文件,使用如下方法:

class FileType1 {
    private Chunk1 c1;
    private Chunk2 c2; // etc

    public void Read(BinaryReader reader) {
        c1 = new Chunk1(reader);
        c2 = new Chunk2(reader);
    }
}

但是,我正在尝试通过指定文件遵循的格式(即 Chunk1 后跟 Chunk2 等)来想一些通用读取这些文件的方法,以便读者可以确保文件具有适当的结构.我可以使用 Chunk 父类(super class)和 Chunk 工厂来一般地读取任何给定文件中的所有 block 。本质上,我想通过结构验证器(或类似的东西)的附加功能来增强它,以产生类似于此的方法:

public void Read(BinaryReader reader, ChunkFileFormat format) {
    while (!EOF) {
        char[] chunkID = reader.ReadChars(4);
        Chunk c = chunkFactory.Create(chunkID);
        if (c.GetType() != format.Next.GetType())
            throw new Exception("File format is invalid");
        format.SetCurrentRecord(c);
    }
}

这里的想法是,ChunkFileFormat 类指定文件的结构,指示下一个从二进制流中读入的 block 类型。这将允许 ChunkFileFormat 的子类指定该特定格式的布局,并且单个读取方法可用于读取所有不同的分块文件格式,而不是为每种格式编写冗长且重复的方法。

我的问题是,是否有人知道可以处理这种情况的设计模式或方法?我正在从事的项目目前使用 C#,但我对 C++(或与此相关的任何语言)的解决方案感兴趣。

提前致谢!

最佳答案

这些类型的规则很容易使用 finite-state machine 编码.

每个 block 都应该改变你所处的状态。每个状态之后等待特定的 block 。如果遇到了当前不应该遇到的 block ,那就是错误。

关于c# - 一般读取格式正确的二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1420044/

相关文章:

c++ - 静态多态定义与实现

c++ - 为什么或为什么不在 C++ 中使用 memset?

c++ 将 printf 与 wprintf 混合(或将 cout 与 wcout 混合)

java - 使用 FileInputStream 从二进制文件读取

c# - 为什么带有Func参数的.Where()执行查询?

c# - 如何使用 Selenium Web Driver 和 C# 清除浏览器 cookie

c# - 在 asp.net mvc 中打开 .aspx 文件作为 cshtml 的部分 View

c - 将多个文件内容写入单个文件的有效方法

Python 列出目录、子目录和文件

C#,一种在两个或多个空格的第一次(也是第一次)出现时拆分字符串的优雅方法?