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!