1. htonl 与 ntohl 在小端机器上做什么?为何需要?
htonl 与 ntohl 在小端机器上分别做什么?它们存在的意义是什么?
- 大小端字节序的概念
- htonl/ntohl 的语义与实现
- 网络字节序(大端)为何被统一
htonl 把 32 位整数从"主机字节序"转换为"网络字节序"(大端),ntohl 反向转换。在小端机器上,htonl 会把整数的字节顺序反转(例如 0x12345678 存储为字节序 78 56 34 12,网络中看到的是 12 34 56 78);在已是大端的机器上它们是空操作。之所以需要,是因为网络协议(TCP/IP)规定所有多字节字段以网络字节序(大端)传输,不同的 CPU 字节序不同,为了多台机器能正确交换数据,必须在发送端把主机序转成网络序、接收端把网络序转回主机序。
字节序是体系结构的差异,网络层必须提供统一的约定。htonl/ntohl 把"主机字节序"这一平台相关细节封装起来,使代码跨平台可移植,也是"网络字节序"名字的由来。
#include <arpa/inet.h>
#include <stdio.h>
int main() {
uint32_t x = 0x12345678;
uint32_t net = htonl(x); // 小端机器上字节序反转
uint32_t back = ntohl(net); // 还原为 0x12345678
printf("%08x %08x %08x\n", x, net, back);
return 0;
}