计算机网络中的大小端问题
·
1. 字节序(Byte Order)背景
- 大端序(Big-Endian):高位字节存储在低地址,低位字节存储在高地址(网络传输标准)。
- 例如:
0x12345678存储为12 34 56 78。
- 例如:
- 小端序(Little-Endian):高位字节存储在高地址,低位字节存储在低地址(x86/ARM等常见架构)。
- 例如:
0x12345678存储为78 56 34 12。
- 例如:
2. 大小端数据传输转换
1.htonl 函数
- 全称:
Host To Network Long - 作用:将 32位整数(如
int或uint32_t)从 主机字节序 转换为 网络字节序(大端序)。 - 使用场景:
- 发送数据前,将本机字节序转换为网络标准字节序。
- 例如:设置 IPv4 地址 (
struct in_addr) 或端口号。
示例代码:
#include <arpa/inet.h>
uint32_t host_value = 0x12345678;
uint32_t network_value = htonl(host_value); // 转换为大端序
2. ntohl 函数
- 全称:
Network To Host Long - 作用:将 32位整数 从 网络字节序 转换回 主机字节序。
- 使用场景:
- 接收数据后,将网络标准字节序转为本机字节序。
- 例如:解析收到的 IPv4 地址或端口号。
示例代码:
#include <arpa/inet.h>
uint32_t network_value = 0x78563412; // 假设从网络接收的大端序数据
uint32_t host_value = ntohl(network_value); // 转换为主机字节序
3. 其他相关函数
| 函数 | 作用 | 数据类型 |
|---|---|---|
htons | Host to Network Short | 16位(如端口) |
ntohs | Network to Host Short | 16位(如端口) |
htonll | Host to Network Long Long | 64位(非标准) |
ntohll | Network to Host Long Long | 64位(非标准) |
4. 常见应用场景
(1) 设置 IP 地址和端口
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8080); // 16位端口转换
addr.sin_addr.s_addr = htonl(INADDR_ANY); // 32位IP地址转换
(2) 处理网络数据包
// 接收数据包
uint32_t network_number;
recv(socket_fd, &network_number, sizeof(network_number), 0);
// 转换为主机字节序
uint32_t host_number = ntohl(network_number);
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)