1、字节序概念
是指多字节数据的存储顺序
2、分类
(1)大端格式:将低位字节数据存储在低地址(首地址)
(2)小端格式:将高位字节数据存储在低地址(首地址)
问题1:如何确定我们主机的字节序格式?
3、使用union函数确定主机的字节序格式
#include<stdio.h>
union A
{
int a;
char b;
};
int main()
{
union A myunion;
myunion.a= 0x12345678;
if(myunion.b==0x12)
{
printf("大端格式 \n");
}
else
{
printf("小端格式\n");
}
return 0;
}
运行结果
小端格式
问题2:我们为什么要学习字节序,有什么用处?
我们学习了linux网络编程,我要与你通信,是不是需要把语言规定好。上面提到的字节序有两种格式。
假设小端格式是说汉语,大端格式是说英语。我的电脑是小端格式(说听都是用汉语),你的电脑是大端格式(说听都是用英语)。我发中文给你,你能听的懂??听不懂。你发英语给我,我也听不懂。
那么,我们这算是交流??肯定不是,这是 对牛弹琴
因此,我们需要统一使用同一种格式(让我们在同一个频道上)
网络协议:指定了通讯字节序---------------大端格式
4、字节序转化函数
4.1特点:
1、网络协议指定了通讯字节序—大端
2、只有在多字节数据处理时才需要考虑字节序
3、运行在同一台计算机上的进程相互通信时,一般不用考虑字节序
4、异构计算机之间通讯,需要转换自己的字节序为网络字节序
在需要字节序转换的时候一般调用特定字节序转换函数
host ‐‐> network(主机字节序转化网络字节序(大端))
4.2、函数定义1(htonl)
host ‐‐> network(主机字节序转化网络字节序(大端格式))
头文件
#include <arpa/inet.h>
函数:
uint32_t htonl(uint32_t hostint32);
功能:
将32位主机字节序数据转换成网络字节序数据
参数:
hostint32:待转换的32位主机字节序数据
返回值:
成功:返回网络字节序的值
4.3、函数定义2(htons)
host ‐‐> network(主机字节序转化网络字节序(大端格式))
头文件
#include <arpa/inet.h>
函数:
uint16_t htons(uint16_t hostint16);
功能:
将16位主机字节序数据转换成网络字节序数据
参数:
uint16_t:unsigned short int
hostint16:待转换的16位主机字节序数据
返回值:
成功:返回网络字节序的值
network ‐‐> host(网络字节序(大端)转化主机字节序)
4.4、函数定义3(ntohl)
network ‐‐> host(网络字节序(大端格式)转化主机字节序)
头文件
#include <arpa/inet.h>
函数:
uint32_t ntohl(uint32_t netint32);
功能:
将32位网络字节序数据转换成主机字节序数据
参数:
uint32_t: unsigned int
netint32:待转换的32位网络字节序数据
返回值:
成功:返回主机字节序的值
4.5、函数定义4(ntohs)
network ‐‐> host(网络字节序(大端格式)转化主机字节序)
头文件
#include <arpa/inet.h>
函数:
uint16_t ntohs(uint16_t netint16);
功能:
将16位网络字节序数据转换成主机字节序数据
参数:
uint16_t: unsigned short int
netint16:待转换的16位网络字节序数据
返回值:
成功:返回主机字节序的值
45、简单的使用
#include<stdio.h>
#include <arpa/inet.h>
int main()
{
int a = 0x12345678;
short b=0x1234;
printf("a = 0x12345678\n");
printf("b = 0x1234\n");
printf("host---------network\n");
printf("%#x\n",htonl(a));
printf("%#x\n",htons(b));
printf("network---------host\n");
printf("%#x\n",ntohl(a));
printf("%#x\n",ntohs(b));
return 0;
}
运行结果
a = 0x12345678
b = 0x1234
host---------network
0x78563412
0x3412
network---------host
0x78563412
0x3412
本机(host)是小端模式