面试题答案
一键面试字节序转换处理
在不同主机环境下,数据存储的字节序可能不同,主要有大端序(Big-Endian)和小端序(Little-Endian)。为确保数据一致性,需要进行字节序转换。在UDP网络程序中,通常使用网络字节序(大端序)进行数据传输。
对于整数类型,C 标准库提供了 htons
(主机字节序转网络字节序,适用于短整数)、htonl
(主机字节序转网络字节序,适用于长整数)、ntohs
(网络字节序转主机字节序,适用于短整数)和 ntohl
(网络字节序转主机字节序,适用于长整数)函数。
关键代码示例
#include <stdio.h>
#include <arpa/inet.h> // 包含字节序转换函数头文件
#include <string.h>
// 定义自定义结构体
typedef struct {
short int num1;
int num2;
} CustomStruct;
// 发送端(客户端)
void send_data(int sockfd, const struct sockaddr *dest_addr, socklen_t addrlen) {
CustomStruct data;
data.num1 = 1234;
data.num2 = 567890;
// 字节序转换
data.num1 = htons(data.num1);
data.num2 = htonl(data.num2);
sendto(sockfd, &data, sizeof(CustomStruct), 0, dest_addr, addrlen);
}
// 接收端(服务器)
void receive_data(int sockfd) {
CustomStruct data;
socklen_t addrlen;
struct sockaddr_storage src_addr;
recvfrom(sockfd, &data, sizeof(CustomStruct), 0, (struct sockaddr *)&src_addr, &addrlen);
// 字节序转换
data.num1 = ntohs(data.num1);
data.num2 = ntohl(data.num2);
printf("Received data: num1 = %d, num2 = %d\n", data.num1, data.num2);
}
在上述代码中,发送端使用 htons
和 htonl
函数将结构体中的数据成员转换为网络字节序,接收端使用 ntohs
和 ntohl
函数将接收到的数据转换为主机字节序,以此确保在不同主机环境下数据的一致性。