通常读取格式良好的二进制文件

时间:2009-09-14 06:55:24

标签: c# c++ file binary

我正在尝试将游戏地图/模型文件的内容读入程序,以便编写小型模型查看器并测试一些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 ++(或任何语言)的解决方案感兴趣。

提前致谢!

2 个答案:

答案 0 :(得分:2)

使用finite-state machine可以轻松编码这些规则。

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

答案 1 :(得分:0)

您可以使用DataScript / antlr创建格式的正式描述,并为您创建解析和I / O代码(Java或C ++)。