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位整数(如 intuint32_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. 其他相关函数

函数作用数据类型
htonsHost to Network Short16位(如端口)
ntohsNetwork to Host Short16位(如端口)
htonllHost to Network Long Long64位(非标准)
ntohllNetwork to Host Long Long64位(非标准)

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);
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐