Lesen Binär-Datei definiert eine struct
Konnte jemand mich in die richtige Richtung, wie ich Lesen konnte, eine binäre Datei, die definiert ist durch eine C-struct?
Es hat ein paar #define innerhalb der Struktur, das macht mir die Sache, es wird die Dinge zu komplizieren.
Die Struktur sieht ungefähr so aus: (obwohl der größer und komplizierter als das)
struct Format {
unsigned long str_totalstrings;
unsigned long str_name;
#define STR_ORDERED 0x2
#define STR_ROT13 0x4
unsigned char stuff[4];
#define str_delimiter stuff[0]
}
Ich würde es wirklich schätzen, wenn jemand könnte mich in die richtige Richtung auf, wie dies zu tun. Oder wenn es irgendein tutorial gibt, umfasst dieses Thema?
Vielen Dank im Voraus für Eure Hilfe.
- als AShelly darauf hingewiesen, dass der #defines nicht von Bedeutung, in der Struktur, aber ein bisschen merkwürdig. Wenn Sie glauben, es ist besser lesbar, das ist in Ordnung. Ich möchte nur sicherstellen, dass Sie glaube nicht, dass die #defines sind irgendwie "scoped", um die struct, und kann nur verwendet werden mit der struct.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lesen eine binäre, definiert durch ein struct ist einfach.
den #defines nicht auf die Struktur überhaupt. (Innen ist eine ungerade Ort, um Sie, obwohl).
Dies ist jedoch kein cross-Plattform sicher. Es ist die einfachste Sache, die möglicherweise funktionieren, in Situationen, in denen Sie sicher sind, die reader-und writer sind unter Verwendung der gleichen Plattform.
Der bessere Weg wäre, zu re-definieren Sie Ihre Struktur als solche:
haben und dann ein 'platform_types.h" die typedefs Uint32 korrekt für den compiler. Jetzt Lesen Sie direkt in der Struktur, aber für die endianness Fragen, die Sie noch brauchen
etwas wie das hier tun:
wo FileToNative ist entweder ein nicht-op-oder eine byte-Reversierung, je nach Plattform.
Gibt es einige schlechte Ideen und gute Ideen:
Das ist eine schlechte Idee:
int
,long
,short
, etc, geben Sie " C/C++. Sie können alles verwenden, wieint16_t
, aber diese sind nur auf Compilern.read
syscall und analysieren einer Puffer-dann — oder Umgekehrt, Lesen ganze Sache auf einmal und nicht mehr körnig, faul liest, wo es anwendbar ist).Es ist eine gute Idee,
Gibt es mehrere tools zur Verfügung, zu tun:
Verwendung von C++ - I/O-Bibliothek:
Verwendung von C-I/O-Bibliothek:
Können Sie auch verwenden, Gewerkschaften zu tun, diese analysieren, wenn Sie den Daten, die Sie wollen, zu analysieren, die bereits im Speicher.
Denken Sie auch daran, dass lange konnte werden in verschiedenen Größen auf verschiedenen Plattformen. Wenn Sie sind abhängig von der längst eine gewisse Größe haben, ziehen Sie die Verwendung der Typen int stdint.h wie uint32_t.
Müssen Sie herausfinden, die endiannes der Maschine, in dem die Datei geschrieben wurde, so können Sie interpret ganzen zahlen richtig. Schauen Sie sich für ILP32 vs LP64-mismatch. Die ursprüngliche Struktur Verpackung/Ausrichtung könnte ebenfalls wichtig sein.