htons()函数在大端系统上的作用是什么?

7

htons()函数将主机字节顺序转换为网络字节顺序。

网络字节顺序是大端字节序,而主机字节顺序可以是小端字节序或大端字节序。

在小端系统上,htons()函数将多字节变量的顺序转换为大端字节序。如果主机字节顺序也是大端字节序,htons()函数会怎么做呢?


3
这是一个"空操作" - 什么也不做。 - Ed Heal
1个回答

14

如果主机字节顺序也是大端字节顺序,那么htons()会做什么呢?

事实上,它什么都不会做。引入htons()的目的,是让你编写不关心系统字节顺序的代码。在定义这些函数的头文件中,字节顺序是唯一需要考虑的问题。

这里是一个实现,在参数表达式周围加上括号以替换htons

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

2
网络字节序的字节序是“大端序”还是与网络有关?我怀疑它曾经与网络相关,但现在Linux只考虑TCP/IP网络字节序——也就是大端序。 - chux - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接