【问题标题】:Generically reading a well-formed binary file一般读取格式良好的二进制文件
【发布时间】:2010-11-28 01:10:32
【问题描述】:

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

提前致谢!

【问题讨论】:

    标签: c# c++ file binary


    【解决方案1】:

    这些规则很容易使用finite-state machine 编码。

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

    【讨论】:

    • 谢谢,这可能是我正在寻找的解决方案,现在实施 :-) 感谢您为我指明正确的方向。
    【解决方案2】:

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

    【讨论】:

    • 谢谢,我会看看,但我不确定这是否正是我所追求的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 2016-12-26
    相关资源
    最近更新 更多