2016-05-04 5 views
1

Ich muss einen Puffer von enums zwischen einem Server und einem Client senden, die in einer anderen Plattform sein könnten.htons(), htonl(), ntohs(), ntohl() für enums

Aber die Größe von enums ist plattformabhängig, welche Funktion sollte ich aufrufen? (htons() or htonl()), zum Beispiel für die folgenden Enum:

typedef enum f_test_enum{ 
F0 = 0, 
F1 = 1, 
F2 = 2, 
F3 = 3 
} f_test_type; 

Denken Sie daran, C Standard (C99): http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

6.7.2.2 Enumeration Bezeich

[...]

Constraints Der Ausdruck, der den Wert einer Enumeration Konstante definiert, muss ein ganzzahliger konstanter Ausdruck sein, der einen Werthatdarstellbar als int.

[...]

Jeder Aufzählungstyp wird mit char, Signed Integer Typ oder ein unsigned Integer-Typ kompatibel sein. Die Wahl des Typs ist implementierungsdefiniert, muss jedoch die Werte aller Mitglieder der Enumeration darstellen können.

[EDITED] Was passiert, wenn meine Enum ist:

typedef enum n_test_large_enum{ 
N1 = 0, 
N2 = 1, 
N2 = 2, 
N120000 = 120000 
} n_test_large_type; 

oder vielleicht:

typedef enum n_test_short_enum{ 
N0 = 0, 
N1 = 1, 
N2 = 2, 
N60000 = 60000 
} n_test_short_type; 

Als ich Hton *() oder ntoh *() verwenden, sollte ich darauf achten, über mögliche Werte für enums? Kann ich für alle Enums das gleiche Verhalten anwenden?

Antwort

3

Nur der Wert ist wichtig, solange beide Seiten die Kodierung vereinbaren.

Also, solange Ihr Wert in eine kurze passt, dann htons() oder htonl() funktioniert, wenn auf beiden Seiten konsistent.

Und wenn es wirklich in ein Byte passt, senden Sie einfach, dass das ganze Byte-Reihenfolge Problem verschwinden.

+0

Was meinen Sie, wenn Sie auf beiden konsistent sagen? Was passiert, wenn die Enumeration von der Seite des Senders in ein Byte passt, aber nicht auf den Empfänger? – Rama

+0

@Rama: senden Sie Daten zwischen Maschinen, die unterschiedliche Definitionen haben, was ein "Byte" ist? –

+0

Nun, heh, war einmal die * Byte * Definition ein bisschen vage, aber mit dem halben Jahrhundert vor dem Tod des All-Caps-Fortran-Programms auf einem CDC x600 waren alle Bytes mindestens 8 Bits. Darauf können Sie zählen. (Wie auch immer, Netzwerk * ​​Oktetts * sind als 8 Bits definiert, und mindestens ein Standard definiert * Byte * auf diese Weise.) – DigitalRoss