字节序转换函数
为什么要引入网络字节序?
因为socket在不同系统之间通信,他们对于数据的存储是不同的,可能会无法解析数据。所以要统一一个字节序。
头文件:#include<arpa/inet.h>
//h代表host
//n代表network
//s代表short
//l代表long
//例子:ntohl-> 网络字节序转换成主机字节序
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
地址转换函数:
IP地址两种表述方式:
- 点分十进制(192.168.0.100)
- 32位二进制数 0Xc0a80064(H) = 3232235620d
我们比较直观的IP地址“点分十进制” (192.168.0.100)而不是32位的IP地址。编程的时候是需要32位的地址。所以我们需要引用地址转换函数。
int inet_ato(const char* cp,struct in_addr * inp)
常用的两个:
in_addr_t inet_addr(const char* cp ) //点分十进制转换成32位整数
char *inet_ntoa(struct in_addr in); //32位地址结构转换成点分十进制
整体的代码:
#include<stdio.h>
#include<arpa/inet.h> //字节序转换函数
#include<netinet/in.h> //地址转换函数,不仅包含这个头文件还需要包含<aroa/inet.h>头文件
int main(){
unsigned int x = 0x12345678;
unsigned char* p = (unsigned char*)&x;
unsigned long addr = inet_addr("192.168.1.100");
printf("0%x_0%x_0%x_0%x\n",p[0],p[1],p[2],p[3]); //%x,%X 读入十六进制整数
printf("addr=%u\n",ntohl(addr));
struct in_addr ipaddr;
ipaddr.s_addr = addr;
printf("%s\n",inet_ntoa(ipaddr));
return 0;
}
结果: