![](/img/trans.png)
[英]Example of reading well-formed and valid xml reading using xmlReader
[英]Generically reading a well-formed binary file
我正在尝试将游戏的地图/模型文件的内容读入程序,以便编写小型模型查看器并测试一些DirectX功能。 模型/映射文件格式本质上是分块的,我知道这些文件的格式。 我可以通过解析各个块来轻松读取文件,使用如下方法:
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超类和Chunk工厂来一般读取任何给定文件中的所有块。 基本上,我想用结构验证器(或类似的东西)的附加功能来增加这一点,以产生类似于此的方法:
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类指定文件的结构,指示下一个从二进制流中读入的块类型。 这将允许ChunkFileFormat的子类指定该特定格式的布局,并且单个读取方法可用于读取所有不同的分块文件格式,而不是为每个格式编写冗长且重复的方法。
我的问题是,是否有人意识到可以应对这种情况的设计模式或方法? 我正在研究的项目目前在C#中,虽然我对C ++(或任何语言)的解决方案感兴趣。
提前致谢!
使用有限状态机可以轻松编码这些规则。
每个块都应该改变你所处的状态。每个状态都在等待特定的块之后。 如果遇到当前不应该遇到的块,那就是错误。
您可以使用DataScript / antlr创建格式的正式描述,并让它为您创建解析和I / O代码(Java或C ++)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.