【问题标题】:What does htons() do on a Big-Endian system?htons() 在 Big-Endian 系统上做了什么?
【发布时间】:2016-07-15 16:42:45
【问题描述】:

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

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

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

【问题讨论】:

  • 这是一个无用的 - 什么都不做

标签: c linux endianness


【解决方案1】:

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

什么都没有——字面意思。首先引入htons() 的目的是让你编写不关心系统字节序的代码。定义函数的头文件是唯一发挥字节序的地方。

这里是one implementation,用其参数表达式周围的括号替换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)

【讨论】:

  • “网络顺序”的字节序是定义为“大字节序”还是依赖于网络?我怀疑它曾经 依赖于网络,但 Linux 现在只考虑 TCP/IP 网络字节顺序 - 这是大端。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 2011-10-06
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
相关资源
最近更新 更多