ich ein ELF-Analysator schreibe, aber ich einige Probleme, richtig konvertieren Endian. Ich habe Funktionen, um die Endianess des Analysators und die Endianness der Objektdatei zu bestimmen.Endianness Swap ohne ntohs
Grundsätzlich gibt es vier mögliche Szenarien:
- Ein Big-Endian zusammengestellt Analysator läuft auf einer Big-Endian-Objektdatei
- Bedürfnisse nichts umgewandelt
- Ein Big-Endian zusammengestellt Analysator läuft auf eine little-endian-Objektdatei
- die Byte-Reihenfolge Bedarf getauscht, aber ntohs/l() und htons/l() sind beide null Makros o In einer großen Endian-Maschine werden sie die Byte-Reihenfolge nicht vertauschen. Das ist das Problem
- A Little-Endian zusammengestellt Analysator läuft auf einer Big-Endian-Objektdatei
- der Byte-Reihenfolge Bedarf ausgetauscht, so verwendet htons(), um die Byte-Reihenfolge
- zu tauschen Ein mit Little Endian kompilierter Analysator wird auf einer kleinen Endian-Objektdatei ausgeführt.
- nichts Bedürfnisse umgewandelt
Gibt es eine Funktion, die ich verwenden kann, um explizit tauschen Byte-Reihenfolge/Wechsel endianness, da ntohs/l() und htons/l() nimmt die endianness des Host-Rechnung und manchmal nicht konvertieren? Oder muss ich meine eigene Swap-Byte-Order-Funktion finden/schreiben?
Technisch undefiniertes Verhalten in C++ obwohl. – bames53
Aber woher wissen wir die richtige Reihenfolge? –
@BoPersson OP weiß, wann er Bytes tauschen will. Ich habe meine Antwort bearbeitet, um die passendere Lösung zu finden. –