2016-03-28 3 views
3

htons() konvertiert Host-Byte-Reihenfolge in Netzwerk-Byte-Reihenfolge.Was macht htons() auf einem Big-Endian-System?

Netzwerk-Byte-Reihenfolge ist Big-Endian und Host-Byte-Reihenfolge kann entweder Little-Endian oder Big-Endian sein.

Bei einem Little-Endian-System wird htons() die Reihenfolge einer Multi-Byte-Variablen in Big-Endian umwandeln. Was wird htons() tun, wenn die Host-Byte-Reihenfolge auch Big-Endian ist?

+2

Es ist ein noop - tut nichts –

Antwort

7

Was wird htons() tun, wenn die Host-Byte-Reihenfolge auch Big Endian ist?

Nichts - ganz wörtlich. Der Zweck der Einführung von htons() an erster Stelle ist, dass Sie Code schreiben können, der sich nicht um die Endianess Ihres Systems kümmert. Header-Datei, wo die Funktionen definiert sind, ist der einzige Ort, wo Endianess ins Spiel kommt.

Hier one implementation ist die htons mit Klammern um seine Parameter Ausdruck ersetzt:

#if BYTE_ORDER == BIG_ENDIAN 

#define HTONS(n) (n) 
#define NTOHS(n) (n) 
#define HTONL(n) (n) 
#define NTOHL(n) (n) 

#else 

#define HTONS(n) (((((unsigned short)(n) & 0xFF)) << 8) | (((unsigned short)(n) & 0xFF00) >> 8)) 
#define NTOHS(n) (((((unsigned short)(n) & 0xFF)) << 8) | (((unsigned short)(n) & 0xFF00) >> 8)) 

#define HTONL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \ 
        ((((unsigned long)(n) & 0xFF00)) << 8) | \ 
        ((((unsigned long)(n) & 0xFF0000)) >> 8) | \ 
        ((((unsigned long)(n) & 0xFF000000)) >> 24)) 

#define NTOHL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \ 
        ((((unsigned long)(n) & 0xFF00)) << 8) | \ 
        ((((unsigned long)(n) & 0xFF0000)) >> 8) | \ 
        ((((unsigned long)(n) & 0xFF000000)) >> 24)) 
#endif 

#define htons(n) HTONS(n) 
#define ntohs(n) NTOHS(n) 

#define htonl(n) HTONL(n) 
#define ntohl(n) NTOHL(n) 
+1

Ist das Endian einer „Netzwerk Ordnung“ definiert „Big-Endian“ zu sein oder ist die netzwerkabhängig? Ich vermute, dass es einmal _was_ netzwerkabhängig war, aber Linux berücksichtigt jetzt nur die TCP/IP-Netzwerk-Byte-Reihenfolge - was Big-Endian ist. – chux