Endianness swap ohne ntohs

8

Ich schreibe einen ELF-Analysator, aber ich habe Probleme, die Endiane korrekt zu konvertieren. Ich habe Funktionen, um die Endianess des Analysators und die Endianness der Objektdatei zu bestimmen.

Grundsätzlich gibt es vier mögliche Szenarien:

  1. Ein Big-Endian-kompilierter Analysator, der auf einer Big-Endian-Objektdatei ausgeführt wird
    • nichts muss konvertiert werden
  2. Ein Big-Endian-kompilierter Analysator wird auf einer kleinen Endian-Objektdatei ausgeführt
    • Die Byte-Reihenfolge muss vertauscht werden, aber ntohs / l () und htons / l () sind beide Null-Makros auf einer Big-Endian-Maschine, so dass sie die Byte-Reihenfolge nicht vertauschen. Das ist das Problem
  3. Ein kleiner Endian-kompilierter Analysator, der auf einer Big-Endian-Objektdatei ausgeführt wird
    • Die Byte-Reihenfolge muss vertauscht werden. Verwenden Sie also htons (), um die Byte-Reihenfolge
    • zu vertauschen
  4. Ein Little-Endian-kompilierter Analysator wird auf einer kleinen Endian-Objektdatei ausgeführt.
    • nichts muss konvertiert werden

Gibt es eine Funktion, die ich verwenden kann, um die Bytereihenfolge / Änderungsendianness explizit zu vertauschen, da ntohs / l () und htons / l () die Endigkeit des Hosts berücksichtigen und manchmal nicht konvertieren? Oder muss ich meine eigene Swap-Byte-Ordnungsfunktion finden / schreiben?

    
xdumaine 26.04.2012, 21:09
quelle

5 Antworten

3
  

Muss ich meine eigene Swap-Byte-Ordnungsfunktion finden / schreiben?

Ja, das tust du. Aber um es Ihnen leichter zu machen, verweise ich Sie auf diese Frage: Wie konvertiere ich zwischen Big-Endian- und Little-Endian-Werten in C ++? , die eine Liste von Compiler-spezifischen Byte-Order-Swap-Funktionen sowie einige Implementierungen von Byte-Order-Swap-Funktionen enthält .

    
David Heffernan 26.04.2012, 21:12
quelle
10

Ich denke, es lohnt sich, The Byte Order Fallacy hier zu lesen, von Rob Pyke (einer von Gos Autor).

Wenn Sie Dinge richtig machen - dh Sie nehmen nicht etwas von der Byte-Reihenfolge Ihrer Plattformen an - dann wird es einfach funktionieren. Alles, was Sie beachten müssen, ist, ob sich Dateien im ELF-Format im Little Endian oder Big Endian -Modus befinden.

Aus dem Artikel:

  

Nehmen wir an, Ihr Datenstrom hat eine kleine Endian-codierte 32-Bit-Ganzzahl. Hier ist, wie es zu extrahieren (angenommen, vorzeichenlose Bytes):

%Vor%
  

Wenn es Big-Endian ist, hier ist, wie man es extrahiert:

%Vor%

Und lassen Sie den Compiler sich nur darum sorgen, das Ganze zu optimieren.

    
Matthieu M. 27.04.2012 06:49
quelle
7

In Linux gibt es mehrere Konvertierungsfunktionen in endian.h , die es erlauben zwischen beliebigen endianess zu konvertieren:

%Vor%

Bearbeitete, weniger zuverlässige Lösung. Sie können union verwenden, um auf die Bytes in beliebiger Reihenfolge zuzugreifen. Es ist sehr praktisch:

%Vor%     
Rafał Rawicki 26.04.2012 21:12
quelle
1

Die ntoh-Funktionen können zwischen mehr als nur big und little endian wechseln. Einige Systeme sind auch 'Middle Endian', wo die Bytes nicht auf die eine oder andere Weise geordnet sind, sondern aufgemischt werden.

Wie auch immer, wenn alles, was Ihnen wichtig ist, groß und klein ist, dann müssen Sie nur wissen, ob sich die Endgültigkeit des Hosts und der Objektdatei unterscheiden. Sie haben Ihre eigene Funktion, die bedingungslos die Byte-Reihenfolge vertauscht, und Sie rufen sie auf oder nicht, abhängig davon, ob host_endianess()==objectfile_endianess() .

ist oder nicht     
bames53 26.04.2012 21:17
quelle
0

Wenn ich über eine plattformübergreifende Lösung nachdenken würde, die unter Windows oder Linux funktioniert, würde ich etwas schreiben wie:

%Vor%     
Mohammed Safwat 27.04.2012 02:27
quelle

Tags und Links