一、主机字节序和网络字节序
1.什么是字节序?
字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序,分为:大端字节序(Big endian)、小端字节序(Little endian)。
示例:0x11223344
大端字节序 | 小端字节序 | |||
0xa | 11 | 0001 0001 | 44 | 0100 0100 |
0xa+1 | 22 | 0010 0010 | 33 | 0011 0011 |
0xa+2 | 33 | 0011 0011 | 22 | 0010 0010 |
0xa+3 | 44 | 0100 0100 | 11 | 0001 0001 |
一般主机当中使用小端字节序
网络通讯当中必须使用大端字节序
示例:查看主机字节序
uint32_t val32 = 0x11223344;
uint8_t val8 = *( (uint8_t *)&val32 );
if(val8 == 0x44)
printf("本机是小端字节序\n");
else
printf("本机是大端字节序\n");
1.定义了一个无符号32位整型变量val32,并且初始化为0x11223344
2.定义一个8位的无符号整型变量val8,并且将强转以后的val32的数据赋值给val8
3.这样做的目的是获取变量val32第一个字节的值,后面就可通过判断val8的值是0x44或者0x11来确定主机字节序是大端还是小端
二、字节序转换函数
//头文件
#include <arpa/inet.h>
//字节序转换函数
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
头文件
#include <arpa/inet.h>
字节序转换函数
本机转网络 | 网络转主机 | |
32位数据 | htonl | ntohl |
16位数据 | htons | ntohs |
三、IP地址字节序转换函数
1.IP地址可能会存在“点分十进制”的字符串形式,转换之前需要注意
2.主机字节序一般采用小端字节序
3.网络字节序转主机字节序以后通常需要转换成“点分十进制”的字符串
//字符串转32位数据
#include <arpa/inet.h>
//IP地址序转换函数
in_addr_t inet_addr(const char *cp);
int inet_aton(const char *cp, struct in_addr *addr);
int inet_pton(int af, const char *cp, void *addr);
//32位数据转字符串
#include <arpa/inet.h>
//IP地址序转换函数
char* inet_ntoa(struct in_addr in);
int inet_ntop(int af, const void *addr, char *cp);
//支持IPV6的地址转换函数
#include <arpa/inet.h>
//IP地址序转换函数
int inet_pton(int af, const char *cp, void *addr);
int inet_ntop(int af, const void *addr, char *cp);