面试题答案
一键面试在Linux环境下,C语言提供了以下函数用于网络字节序和主机字节序的转换:
htonl()
:将32位整数从主机字节序转换为网络字节序(大端序)。htons()
:将16位整数从主机字节序转换为网络字节序(大端序)。ntohl()
:将32位整数从网络字节序转换为主机字节序。ntohs()
:将16位整数从网络字节序转换为主机字节序。
示例代码将一个32位的整数从主机字节序转换为网络字节序:
#include <stdio.h>
#include <arpa/inet.h>
int main() {
uint32_t host_num = 0x12345678;
uint32_t net_num;
net_num = htonl(host_num);
printf("Host byte order: 0x%08x\n", host_num);
printf("Network byte order: 0x%08x\n", net_num);
return 0;
}
这些函数的工作原理:
htonl()
和htons()
:- 主机字节序可能是大端序(Big - Endian)或小端序(Little - Endian),而网络字节序规定为大端序。
htonl()
函数将32位的主机字节序整数,按照网络字节序(大端序)重新排列字节顺序后返回。例如,如果主机是小端序,0x12345678
在内存中存储为78 56 34 12
,经过htonl()
转换后变为12 34 56 78
。htons()
同理,只是针对16位整数。
ntohl()
和ntohs()
:- 作用与上面两个函数相反,将网络字节序(大端序)的整数转换为主机字节序。如果主机是小端序,
ntohl()
会将12 34 56 78
转换回78 56 34 12
。
- 作用与上面两个函数相反,将网络字节序(大端序)的整数转换为主机字节序。如果主机是小端序,