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

Ram*_*jam 5 c linux endianness

htons() 将主机字节顺序转换为网络字节顺序.

网络字节顺序是Big-Endian,主机字节顺序可以是Little-Endian或Big-Endian.

在Little Endian系统上,htons()将多字节变量的顺序转换为Big-Endian.htons()如果主机字节顺序也是Big-Endian,会怎么做?

das*_*ght 11

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)
Run Code Online (Sandbox Code Playgroud)

  • “网络顺序”的字节序是定义为“大字节序”还是该网络依赖?我怀疑它曾经 _was_ 网络依赖,但 Linux 现在只考虑 TCP/IP 网络字节顺序 - 这是大端。 (2认同)