Strategia per la descrizione del formato file binario in C ++

2

Ho a che fare con un sacco di formati di file binari legacy, reverse engineering, spesso con codice sorgente perso e lettura / scrittura, questi file devono essere ricodificati in C ++.

Mi chiedo se ci sono buoni esempi o idee sul processo di conversione della documentazione del formato file in codice con l'obiettivo di caricare i dati in una classe che può essere caricata / salvata / elaborata.

Dall'inchiesta attuale sul problema, penso che la serializzazione di boost potrebbe essere una delle migliori opzioni ( link ) Anche se non sei sicuro se c'è un modo più semplice usando C ++ e STL?

Sono principalmente preoccupato della facilità di descrivere i dati e di ridurre al minimo la rilavorazione per ogni nuovo tipo di formato di file binario su cui si lavora.

    
posta Malcolm McCaffery 21.06.2016 - 16:16
fonte

1 risposta

2

I am wondering if there are good examples or ideas on simplyfing the process of converting documentation of the file format into code with goal being to load data into a class that can be loaded/saved/processed.

Questo può essere risolto a più livelli:

  • puoi usare boost :: spirit parsing o un serializzatore / deserializzatore personalizzato (come suggerito nei commenti)

  • puoi nascondere l'implementazione dietro un set personalizzato di boost :: iostream tipi di buffer di dispositivo.

I am mostly concerned about the ease of describing the data, and minimizing rework for each new type of binary file format being worked on.

Lo farei creando alcuni tipi personalizzati che mappano i / o byte alle informazioni semantiche, in modo trasparente all'utente:

/// map custom file header info into BlaBla information
class BlaBlaHeaderField
{
     std::uint32_t binary_header;
     BlaBlaHeaderField(std::uint32_t binary_header) { ... }

     /// custom property (interprets individual bytes)
     int BlaBlaParity() { return (binary_header & 0x01); }
};

In questo modo, il formato sarà vicino all'autocodifica dal codice, più tardi.

Puoi anche usare un'unione e sovrapporre i campi con un numero intero / lungo / qualunque.

    
risposta data 22.06.2016 - 11:22
fonte

Leggi altre domande sui tag