2016-08-01 36 views
0

Ich schreibe eine RawFile Klasse in C++ (die Sprache spielt hier keine Rolle). Aber ich möchte die Bibliothek total generisch halten, egal für welche CPU sie kompiliert ist.Wie liest man rohe Dateien in generischer Weise (Little/Big Endian)?

Vorerst Ich habe eine uint16_t swap16(uint16_t value) Funktion, die die zwei Bytes Swap- und gibt eine ganze Zahl ohne Vorzeichen und eine bool is_bigendian() Funktion, die true zurück, wenn das System in Big-Endian-und false sonst (I entschieden, den PDP-11-Byte zu ignorieren -Order-Schema, wie es sehr unwahrscheinlich ist, angetroffen). Schließlich habe ich die Endianz der Rohdatei, die ich lese.

Die Frage ist wie folgt, angesichts der Informationen über die Endianess der Datei und des Systems, wie kann ich entscheiden, ob ich die swap16() Funktion anwenden?

Vorerst habe ich beschlossen, den folgenden Test zu verwenden:

return (file_is_big_endian || system_is_big_endian) ? swap16(value) : value; 

ich die folgende Tabelle angenommen:

sytem\rawfile | little-endian | big-endian | 
-------------------------------------------- 
little-endian | No swap16() | swap16() | 
    big-endian | swap16() | swap16() | 

Aber ich bin nicht wirklich sicher, ob dies richtig ist, könnte ich sein etwas vermissen.

Alle guten Erklärungen (oder bessere Tests) sind willkommen!

Antwort

0

ich meine eigene Frage beantworten ...

In der Tat, erkannte ich, dass ich die Datei Byte pro Byte (in einem "Raw-Modus") las. Also ist die Tatsache, dass das System selbst Little-Endian oder Big-Endian ist, nur irrelevant. Sie müssen nur den Typ der Datei, die Sie neu anordnen lesen prüfen (oder nicht), um den Satz von Bytes Sie lesen ... So ist der Test einfach:

return (file_is_big_endian) ? swap16(value) : value; 

Wahrscheinlich nur eine dumme Frage ...