Welche Transformationen werden von Little-Endian-Systemen verwendet, um Daten zu konvertieren, um zu vernetzen?

StackOverflow https://stackoverflow.com/questions/463416

Frage

Was sind die zugrunde liegenden Transformationen, die konvertieren, um Daten in einem Little-Endian-System in Netzwerk-Byte notwendig sind? Für 2-Byte und 4 Byte-Daten gibt es gut bekannte Funktionen (wie htons, ntohl etc.), um die Änderungen zu kapseln, was für Streicher von 1 Byte Daten geschieht (wenn überhaupt)?

Auch impliziert Wikipedia, dass Little-Endian das Spiegelbild von Big-Endian, aber wenn das wahr wäre, warum würden wir spezifische Behandlung für 2 und 4 Byte Daten benötigen?

Der Aufsatz „On Holy Wars und ein Plädoyer für den Frieden“ scheint zu implizieren, dass es viele verschiedene Varianten von Little-Endian sind - es ist ein alter Aufsatz - ist das noch zu? Ist Byteorder Marker wie die, die am Anfang der Java-Klassendateien immer noch notwendig gefunden?

Und schließlich ist 4-Byte-Ausrichtung, die für Netzwerk-Byte-Reihenfolge?

War es hilfreich?

Lösung

Angenommen, Sie haben den ASCII-Text "BigE" in einem Array b von Bytes haben.

b[0] == 'B'
b[1] == 'i'
b[2] == 'g'
b[3] == 'E'

Dies ist Netzwerk, um für die Zeichenfolge als auch.

Wenn es als 32-Bit-Integer behandelt wurde, wäre es

'B' + ('i' << 8) + ('g' << 16) + ('E' << 24) 

auf einer Little-Endian-Plattform und

'E' + ('g' << 8) + ('i' << 16) + ('B' << 24) 

auf einer Big-Endian-Plattform.

Wenn Sie jede 16-Bit-Arbeit separat konvertieren, dann würden Sie keine dieser beiden

erhalten
'i' + ('B' << 8) + ('E' << 16) + ('g' << 24) 

weshalb ntohl und ntohs sind beide erforderlich.

Mit anderen Worten, ntohs Swaps Bytes innerhalb eines 16-Bit kurz und ntohl kehrt die Reihenfolge der vier Bytes der 32-Bit-Wort.

Andere Tipps

Spezielle Handhabungsfunktionen für 2 und 4 Byte-Daten nutzen die Tatsache, dass es Prozessorbefehle, die auf bestimmte Datengrößen arbeiten. eine 1-Byte-Umkehrfunktion viermal laufen zu lassen ist sicherlich weniger effizient als breitere Anweisungen unter Verwendung der gleichen (wenn auch erhöhte sich im Maßstab) Operationen an allen vier Bytes auf einmal auszuführen.

1 Byte Daten erfordern keine Umwandlung zwischen endians (es ist ein Vorteil der UTF-8 über UTF-16 und UTF-32 für die String-Codierung).

  

4-Byte-Ausrichtung, die für Netzwerk-Byte-Reihenfolge?

Keine spezielle Ausrichtung ist notwendig für das Bytes über ein Netzwerk gehen. Ihr Prozessor kann eine bestimmte Ausrichtung im Speicher verlangen, aber es ist an Ihnen, die Diskrepanz zu lösen. Die x86-Familie in der Regel nicht solche Forderungen machen.

Die Grundidee ist, dass alle Multi-Byte-Typen die Reihenfolge ihres Bytes umgekehrt haben müssen. Ein Vier-Byte-Ganzzahl würde Bytes 0 und 3 vertauscht, und die Bytes 1 und 2 vertauscht. Eine Zwei-Byte-Ganzzahl würde Bytes 0 und 1 vertauscht. Ein Ein-Byte-Zeichen nicht getauscht bekommen.

Es gibt zwei sehr wichtig Auswirkungen dieser, dass die Nicht-Praktiker und Novizen nicht erkennen immer:

  1. (ASCII) Zeichenketten werden nicht berührt.
  2. Es ist nicht möglich blinder Algorithmus Byte-Swap-generic "data". Sie haben die Art von all Ihren Daten kennen und jedes Element in der für seine Art erforderlichen Weise tauschen.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top