Genericamente ler um arquivo binário bem formado
Pergunta
Eu estou tentando ler o conteúdo de arquivos de mapa / modelo de um jogo em um programa para efeitos de escrever um pequeno visualizador de modelo e testar alguns DirectX apresenta. Os formatos de arquivo de modelo / mapa são blocos na natureza, e eu sei o formato desses arquivos. Eu posso facilmente ler os arquivos por analisar através dos pedaços individuais, usando uma abordagem como esta:
class FileType1 {
private Chunk1 c1;
private Chunk2 c2; // etc
public void Read(BinaryReader reader) {
c1 = new Chunk1(reader);
c2 = new Chunk2(reader);
}
}
No entanto, eu estou tentando pensar em alguma maneira de ler genericamente esses arquivos, especificando o formato dos adere arquivo para (ie Chunk1 é seguido por Chunk2 etc etc) para que o leitor pode garantir que o arquivo é de uma estrutura adequada . Posso usar uma classe Chunk super e uma fábrica Chunk para ler genericamente todos os pedaços em um determinado arquivo. Essencialmente, eu gostaria de aumentar isso com a funcionalidade adicional de um validador de estrutura (ou algo similar) para resultar em um método semelhante a este:
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);
}
}
A idéia aqui é que a classe ChunkFileFormat especifica a estrutura do arquivo, indicando o que se espera tipo pedaço para ser o próximo lidos do fluxo binário. Isso permitiria que subclasses de ChunkFileFormat para especificar o layout do que o formato particular, eo método de leitura única poderia ser usado para a leitura de todos os formatos de arquivo em partes diferentes, ao invés de escrever um método prolixo e repetitivo para cada um.
A minha pergunta é, é alguém consciente de padrões de projeto ou abordagens que poderiam lidar com esta situação? O projeto que estou trabalhando atualmente em C #, embora eu estaria interessado em soluções em C ++ (ou qualquer linguagem para que o assunto).
Agradecemos antecipadamente!
Solução
Este tipo de regras são facilmente codificado usando um de estado finito máquina .
Cada pedaço deve alterar o estado em que está. Cada estado à espera de pedaços específicos depois. Se você encontrar um pedaço que você não deve encontrar na atual, isso é um erro.
Outras dicas
Você pode criar uma descrição formal do formato usando DataScript / antlr e tê-lo criar análise e i / o código para você (Java ou C ++).