大端小端的存在是为了解决计算机内字节存储排列问题,很多arm,dsp,以及x86系统采用的是小端模式,而keil C51采用的是大端模式,一般操作系统采用小端模式,而通讯协议是大端的。
大端:低位字节存放在内存的高地址端,高位字节存放在内存的低地址端(低高 高低)
小端:低位字节存放在内存的低地址端,高位字节存放在内存的高地址端(低低 高高)
例如:0x1234
0x1234 | 低地址 | 高地址 |
小端 | 34 | 12 |
大端 | 12 | 34 |
如何验证机器的字节序?
1.使用指针
#include<stdio.h>
int main(int argv,char *argc[])
{
int a = 20;//0x0014
char *p = (char *)&a;
//通过验证最低位是0还是1
printf("p = %x",*p);
printf("p+1 = %x",*(p+1));
if(*p == 20)
{
printf("小端模式\n");
}
else
{
printf("大端模式\n");
}
return 0;
}
2.使用联合体
union:联合是在同一个存储空间存储不同类型数据,union数据类型所占空间等于其最大成员所占的空间,联合体访问都是从基地址开始的(从首地址开始)
#include<stdio.h>
int main(int argv,char *argc[])
{
union{
short a;
char b[2];
}u;
u.b[0]= 0x12;
u.b[1]= 0x34;
printf("0x%x\n",u.a);
return 0;
}
3.使用函数
主机字节顺序:小端
网络字节顺序:大端
htonl() //32位无符号整型的主机字节顺序到网络字节顺序的转换(小端->>大端)
htons() //16位无符号短整型的主机字节顺序到网络字节顺序的转换 (小端->>大端)
ntohl() //32位无符号整型的网络字节顺序到主机字节顺序的转换 (大端->>小端)
ntohs() //16位无符号短整型的网络字节顺序到主机字节顺序的转换 (大端->>小端
#include<stdio.h>
#include <arpa/inet.h>
int main(int argv,char *argc[])
{
union{
short a;
char b[2];
}u;
u.b[0]= 0x12;
u.b[1]= 0x34;
printf("0x%x\n",u.a);
printf("0x%x\n",htons(u.a));
return 0;
}