通用读取格式正确的二进制文件

3
我正在尝试将游戏地图/模型文件的内容读入程序,以编写一个小型模型查看器并测试一些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个回答

2

这种规则可以很容易地通过使用有限状态机进行编码。

每个块都应更改您所处的状态。每个状态都在等待特定的后续块。如果您在当前状态下遇到了不应该遇到的块,那就是一个错误。


谢谢,那很可能就是我要找的解决方案,现在我要去实现它 :-) 感谢您指引我正确的方向。 - user172963

0
你可以使用 DataScript/antlr 创建格式的正式描述,并让它为你创建解析和输入/输出代码(Java 或 C++)。

谢谢,我会看一下,但我不确定它是否完全符合我的要求。 - user172963

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接