htons()在Big-Endian系统上做什么?

htons()将主机字节顺序转换为networking字节顺序。

networking字节顺序是Big-Endian,主机字节顺序可以是Little-Endian或Big-Endian。

在Little Endian系统上, htons()会将一个多字节variables的顺序转换为Big-Endian。 如果主机字节顺序也是Big-Endian的话,会怎么办呢?

如果主机字节顺序也是big endian, htons()做什么?

没有 – 完全字面上。 首先介绍htons()的目的是让你编写不关心系统字节顺序的代码。 头文件是定义函数的唯一的地方,在这里endianness发挥作用。

下面是一个用括号括起来的参数表达式的实现:

 #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)