2009-01-20 11 views
7

Was sind die zugrunde liegenden Transformationen, die erforderlich sind, um Daten in einem Little-Endian-System in eine Netzwerk-Byte-Reihenfolge zu konvertieren? Für 2-Byte- und 4-Byte-Daten gibt es wohlbekannte Funktionen (wie z. B. htons, ntohl usw.), um die Änderungen zu kapseln, was passiert bei Strings mit 1-Byte-Daten (wenn überhaupt)?Welche Transformationen werden von Little-Endian-Systemen verwendet, um Daten in die Netzwerkreihenfolge zu konvertieren?

Auch impliziert Wikipedia, dass Little-Endian das Spiegelbild von Big-Endian ist, aber wenn das wahr wäre, warum brauchen wir spezifische Handhabung für 2 und 4 Byte Daten?

Der Essay "Über Heilige Kriege und ein Plädoyer für den Frieden" scheint zu implizieren, dass es viele verschiedene Geschmacksrichtungen von Little-Endian gibt - es ist ein alter Essay - gilt das noch? Sind Byte-Order-Marker, wie sie am Anfang von Java-Klassen-Dateien gefunden werden, noch notwendig?

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

Antwort

6

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

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

Dies ist die Netzwerkreihenfolge für die Zeichenfolge.

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 sein.

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

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

bekommen, weshalb ntohl und ntohs sind beide erforderlich.

Mit anderen Worten, ntohs tauscht Bytes innerhalb eines 16-Bit-Kurzschlusses und ntohl kehrt die Reihenfolge der vier Bytes seines 32-Bit-Worts um.

0

Spezifische Handling-Funktionen für 2- und 4-Byte-Daten nutzen die Tatsache aus, dass es Prozessoranweisungen gibt, die mit bestimmten Datengrößen arbeiten. Es ist sicherlich weniger effizient, eine 1-Byte-Umkehrfunktion viermal auszuführen, als breitere Befehle zu verwenden, um die gleichen (wenn auch im Maßstab erhöhten) Operationen an allen vier Bytes gleichzeitig auszuführen.

0

1 Byte Daten erfordert keine Konvertierung zwischen Endian (es ist ein Vorteil von UTF-8 über UTF-16 und UTF-32 für String-Codierung).

0

ist die 4-Byte-Ausrichtung für die Netzwerk-Byte-Reihenfolge erforderlich?

Für Bytes, die über ein Netzwerk gehen, ist keine spezielle Ausrichtung erforderlich. Ihr Prozessor verlangt möglicherweise eine bestimmte Ausrichtung im Speicher, aber es liegt an Ihnen, die Diskrepanz zu beheben. Die x86-Familie stellt solche Anforderungen normalerweise nicht.

0

Die Grundidee ist, dass alle Multi-Byte-Typen die Reihenfolge ihrer Bytes umgekehrt haben müssen. Bei einer 4-Byte-Ganzzahl würden die Bytes 0 und 3 ausgetauscht und die Bytes 1 und 2 ausgetauscht. Bei einer 2-Byte-Ganzzahl würden die Bytes 0 und 1 getauscht werden. Ein Ein-Byte-Zeichen wird nicht vertauscht.

Es gibt zwei sehr wichtig Auswirkungen dieser, dass die Nicht-Praktikern und Anfänger nicht immer realisieren:

  1. (ASCII) Zeichenketten werden nicht berührt.
  2. Es gibt keine möglichen blinden Algorithmus zu Byte tauschen generische "Daten". Sie müssen den Typ aller Ihrer Daten kennen und jedes Element auf die für seinen Typ erforderliche Weise austauschen.
Verwandte Themen