我正在尝试将游戏 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/