Robert B.: C Pointerei

Beitrag lesen

Moin,

Was nützt ein Datentyp dessen Endiannes systemabhängig ist? Gar nichts!

Also sind Integer- und Double-Werte unnütz.

Nein! Lies bitte noch einmal meinen Post und den Link auf die Manpage. ntohs stellt sicher, dass immer in die korrekte Host Byte Order konvertiert wird und htons immer korrekt in die Netzwerk Byte Order. Immer!

So!?

printf("%#x", htons(53) ); // 0x3500

53 ist BE 0x0035 und LE 0x3500 und das Format-Flag %x arbeitet mit der Endianess deines lokalen Systems. Es wäre doch auch sehr merkwürdig, wenn

printf("%#x\n", 53);

0x3500 ausgäbe anstelle von 0x35. Wenn du überprüfen willst, ob htons richtig funktioniert, musst du dir das Bitmuster anschauen, z.B.

uint16_t ui = 53;

fwrite(&ui, sizeof(ui), 1, file…);
/* … und die Ausgabedatei mit einem Hexeditor betrachten … */

/* … oder mit einem anderen Blick darauf schauen: */
typedef union {
    uint16_t i;
    char b[2];
} Bytes;

Bytes b;
b.i = ui;

printf("0x%x%x", b[0], b[1]);

Rauskommen muss aber 0x0035 ! Wenn das Ergebnis richtig sein soll, muss der Entwickler wissen daß Port 53 als short LE die Zahl 13568 verkörpert.

Nein, er muss seine C-Standard-Bibliothek richtig verwenden.

Viele Grüße
Robert