2017-03-31 3 views
1

Ich arbeite an einem Projekt, wo ich Daten an den Server senden muss und dieser Client wird auf anderen Betriebssystemen ausgeführt. Ich kenne das Problem mit Endianen auf verschiedenen Rechnern, also konvertiere ich "alles" (fast) in die Netzwerk-Byte-Reihenfolge, mit htonl und umgekehrt am anderen Ende. Ich weiß auch, dass ich für ein einzelnes Byte nichts konvertieren muss. Aber was soll ich für Char * tun? ex:C konvertieren char * in Netzwerk-Byte-Reihenfolge vor der Übertragung

send(sock,(char*)text,sizeof(text)); 

Was ist der beste Ansatz, um dies zu lösen? Sollte ich eine 'intermediate function' erstellen, die dieses 'send' abfängt, dann sende ich wirklich char-by-char dieses Char-Arrays? Wenn ja, muss ich jedes Zeichen in die Netzwerk-Byte-Reihenfolge konvertieren? Ich denke nein, da jedes Zeichen nur ein Byte ist. Wenn ich diese "intermediate functions" erstelle, muss ich nichts mehr in die Netzwerk-Byte-Reihenfolge konvertieren, da diese Funktion char by char sendet, also keine Konvertierung von endian benötigt. Ich habe dazu einen Ratschlag.

+5

Senden Sie Text? Dann gibt es keine "Byte-Reihenfolge". Ein Text ist eine Folge von * einzelnen Bytes *, Sie können keine Endian-Probleme mit einem einzelnen Byte haben. Sofern Sie keine Zeichenfolge mit einem breiten Zeichen haben, bei der jedes Zeichen aus mehreren Bytes besteht, könnten Sie natürlich Probleme mit der Endlichkeit haben und eine vordefinierte Byte-Reihenfolge verwenden. –

+0

Werfen Sie einen Blick auf diese: http://stackoverflow.com/questions/1934168/whats-a-portable-way-of-converting-byte-order-of-strings-in-c http: // Stackoverflow. com/questions/15877643/is-there-to-convert-Byte-Reihenfolge für Strings – Gaurav

+0

Was Someprogrammerdude sagte. Endian in Text gilt nur in Zeichenkodierungen, die Multibyte-Werte pro Zeichen verwenden, wie UTF-16 oder UTF-32 (daher definieren sie UTF-16LE/BE- und UTF-32LE/BE-Varianten). Die meisten Textkodierungen verwenden 7/8-Bit-Werte, sodass sie nicht unter Endian-Problemen leiden. –

Antwort

0

Ich gehe von Ihrer Frage aus, dass das Protokoll der Anwendungsebene (genauer gesagt alles über Level 4) unter Ihrer Entwurfskontrolle steht. Für single-Byte-weite (Oktett-weit im Netzwerk Sprachgebrauch) Daten gibt es kein Problem mit Endian-Bestellung und Sie müssen nichts Besonderes tun, um dies zu berücksichtigen. Wenn nun den Zeichendaten ein Längenspezifizierer vorangestellt wird, also beispielsweise 2 Oktetts, dann muss die Reihenfolge der Bytes konsistent behandelt werden.

Gehen mit Netzwerk-Byte-Reihenfolge (Big-Endian) wird sicherlich die Rechnung zu füllen, sondern würde konsequent mit Little-Endian. Die Konsistenz der Byte-Reihenfolge an jedem Ende einer Verbindung ist das entscheidende Problem.

Wenn das Protokoll nicht unter Ihrer Entwurfskontrolle liegt, sollte die Protokollspezifikation Hinweise zum Problem der Byte-Reihenfolge für Ganzzahlen mit mehreren Byte geben, und Sie sollten dem folgen.