gpt4 book ai didi

c# - 一般读取格式正确的二进制文件

转载 作者:太空狗 更新时间:2023-10-29 22:53:41 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com