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)