Pregunta

Estoy tratando de leer el contenido de los archivos de mapa / modelo de un juego en un programa con el propósito de escribir un visor de modelo pequeño y probar algunas características de DirectX. Los formatos de archivo de modelo / mapa están fragmentados en naturaleza, y sé el formato de estos archivos. Puedo leer fácilmente los archivos analizando los fragmentos individuales, usando un enfoque como este:

class FileType1 {
    private Chunk1 c1;
    private Chunk2 c2; // etc

    public void Read(BinaryReader reader) {
        c1 = new Chunk1(reader);
        c2 = new Chunk2(reader);
    }
}

Sin embargo, estoy tratando de pensar en alguna forma de leer genéricamente estos archivos, especificando el formato al que se adhiere el archivo (es decir, Chunk1 es seguido por Chunk2, etc.) para que el lector pueda asegurarse de que el archivo tenga una estructura adecuada . Puedo usar una superclase de Chunk y una fábrica de Chunk para leer genéricamente todos los fragmentos de cualquier archivo. Esencialmente, me gustaría aumentar esto con la funcionalidad adicional de un validador de estructura (o algo similar) para obtener un método similar 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);
    }
}

La idea aquí es que la clase ChunkFileFormat especifica la estructura del archivo, indicando qué tipo de fragmento se espera que sea la próxima lectura de la secuencia binaria. Esto permitiría que las subclases de ChunkFileFormat especifiquen el diseño de ese formato en particular, y el método de lectura única podría usarse para leer todos los diferentes formatos de archivos fragmentados, en lugar de escribir un método repetitivo y de largo aliento para cada uno.

Mi pregunta es: ¿alguien conoce los patrones de diseño o los enfoques que podrían abordar esta situación? El proyecto en el que estoy trabajando actualmente está en C #, aunque me interesarían las soluciones en C ++ (o cualquier otro lenguaje).

¡Gracias de antemano!

¿Fue útil?

Solución

Este tipo de reglas se codifican fácilmente utilizando una máquina de estado finito .

Cada fragmento debe cambiar el estado en el que se encuentra. Cada estado espera fragmentos específicos después. Si encuentra un fragmento que no debería encontrar en el actual, es un error.

Otros consejos

Puede crear una descripción formal del formato usando DataScript / antlr y hacer que cree un análisis y código de E / S para usted (Java o C ++).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top