Frage

in C / C ++, wenn ein Multi-Byte-Wide-Zeichen (Wchar_t) Wert aus einem Big-Endian-System auf ein Little-Endian-System (oder umgekehrt) übertragen wird, wird es den gleichen Wert auf der anderen Seite herauskommen Seite? Oder müssen die Bytes vertauscht werden?

War es hilfreich?

Lösung

Ja, Sie brauchen, um sie auszutauschen.
Die Bytes werden vom Transport in der gleichen Reihenfolge abgerufen werden sie in gestellt wurden. Nur am anderen Ende der Reihenfolge dieses Bytes eine andere Bedeutung hat. So müssen Sie sie auf die richtige Bytereihenfolge konvertieren (ist das ein Wort?).

Die bewährte Methode ist zu konvertieren Byte-Reihenfolge vor dem Transport zu vernetzen. Dann wandelt zurück spezifische Byte-Reihenfolge Host (von Netzwerk-Byte-Reihenfolge) auf Empfang.

Eine Reihe von Funktion mit Endian-Umwandlung zu helfen:

ntohs   Convert a 16-bit quantity from network byte order to host byte order
ntohl   Convert a 32-bit quantity from network byte order to host byte order
htons   Convert a 16-bit quantity from host byte order to network byte order
htonl   Convert a 32-bit quantity from host byte order to network byte order

Sie einfach ein weiteres Wort der Warnung hinzuzufügen.
Verschiedene Systeme verwenden unterschiedliche Größe für wchar_t so tun sizeof nicht annehmen (wchar_t) == 2.

Zusätzlich kann jeder Host eine andere Darstellungsformat für wchar_t verwenden.
Damit befassen sich mit dieser den meisten Systemen, den Text zu einem bekannten Format für den Transport (UTF-8 oder UTF-16 sind eine gute Wahl) konvertieren. Die wandelt den Text wieder in das Host-spezifischen Format am anderen Ende.

könnten Sie schauen auf IBMs icu all diese Funktionalität.

Andere Tipps

Endian Konvertierung ist nicht ausreichend, und als Folge davon nicht benötigt. Sizeof (wchar_t) unterscheidet, und daher auch die Codierung. Daher müssen Sie auf ein Austauschformat vereinbaren. Die logische Wahl ist UTF-8. Aber da UTF-8-Byte-orientiert ist, müssen Sie nicht endianness Probleme mehr haben.

Ja, Sie müssen Endian-Umwandlung durchzuführen. Definieren Sie sorgfältig Ihre Serialisierungsformat, das heißt die Byte-Reihenfolge der Daten, die über das Netzwerk oder gespeichert in einer Datei übertragen wird. Dann, wenn das Senden von Daten, konvertiert von nativen zu Draht-Format (oder auch nicht Byteaustausch erfordern), und beim Empfang von Daten, konvertiert von Draht zu nativen Format (wieder kann oder nicht Byteaustausch erforderlich). Sie sollten ein Draht-Format auswählen, die von der Mehrheit der Kunden verwendet werden, um die durchschnittliche Menge an Byteaustausch zu minimieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top