大小端转换
2026/8/24大约 1 分钟
C语言字节序转换:htonl 与 ntohl
一、什么是字节序?
假设:
uint32_t x = 0x12345678;小端:
低地址 → 高地址
78 56 34 12大端:
低地址 → 高地址
12 34 56 78网络协议通常规定:
网络字节序 = 大端。
二、htonl
htonl:
Host To Network Long
主机序 → 网络序假设 STM32 是小端:
主机内存:
78 56 34 12
↓ htonl
网络数据:
12 34 56 78代码:
uint32_t value = 0x12345678;
uint32_t net = htonl(value);发送 net 的字节就是:
12 34 56 78三、ntohl
ntohl:
Network To Host Long
网络序 → 主机序收到:
12 34 56 78在小端 STM32 上:
网络序
12 34 56 78
↓ ntohl
主机序
78 56 34 12程序最终得到的数值:
0x12345678四、转换流程
发送端:
主机序
↓
htonl()
↓
网络序(大端)
↓
发送
接收端:
接收网络序
↓
ntohl()
↓
主机序
↓
程序使用五、本质
htonl/ntohl 本质就是:
在需要时交换 32 位数据的 4 个字节。
手动交换:
uint32_t swap32(uint32_t x)
{
return ((x & 0x000000FFU) << 24) |
((x & 0x0000FF00U) << 8) |
((x & 0x00FF0000U) >> 8) |
((x & 0xFF000000U) >> 24);
}GCC:
__builtin_bswap32(x);大端主机本身就是网络序,因此 htonl/ntohl 通常无需交换。
记忆:
htonl主机→网络,ntohl网络→主机。

