起源:
端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile Endian。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。在计算机业Big Endian和Little Endian也几乎引起一场战争。在计算机业界,Endian表示数据在存储器中的存放顺序。下文举例说明在计算机中大小端模式的区别。
有人说:
计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的,所以,计算机的内部处理都是小端字节序。但是,人类还是习惯读写大端字节序,所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。
有人说:
存储的单元是字节,网络传输的单元也是字节。大小端是针对字节流中某个字节内存储顺序而制造的一个概念。 比如: 在内存中存储是酱紫的:0x01 0x02 0x03 0x04(X86是4字节),从高字节开始存放(大端)。 然后它向网络发送数据是从左到右发结果字节流就变成了0x04 0x03 0x02 0x01 (0x01是最先发送出去的,看起来网络字节流就变成了小端,小字节在前) 然后接收端接收到的字节流是:然后收到网络数据的顺序就变成了0x01 0x02 0x03 0x04(重新变成了大端)。
有人说
在计算机系统中,规定:每个地址单元都会对应一个字节(8个bit),但是,在c语言中,除了有一个字节(8个bit)的char,也有两个字节(16个bit)的short,也有四个字节(32个bit)的long(在不同的编译器下可能不同)。对于16位或者32位的处理器,即就是大于8位的处理器,由于寄存器的宽度大于一个字节,那么就存在如何将一个多字节的变量的数据如何存放的问题——所以,就有了大小端之分。
有人说:
x86是小端 ARM是大端(自由选择)
还有人说:
就算先有小端,也无法阻止别人开发大端。因为幸亏一条线只有两个端,所以只有大小端。 生命会充满它能找到的所有空间。这是生物的本能。 大小端和CPU有关系,CISC(复杂指令集)CPU一般使用小端数据格式,RISC一般使用大端数据格式 因为有人看着方便和机器识别方便的不同~~~ 存在即合理
4、字节序转换函数
1、htons 把unsigned short类型从主机序转换到网络序(host to network short) 2、htonl 把unsigned long类型从主机序转换到网络序(host to network long) 3、ntohs 把unsigned short类型从网络序转换到主机序(network to host short) 4、ntohl 把unsigned long类型从网络序转换到主机序(network to host long)
检测方法一
#include
int check()
{
union UN
{
char c;
int i;
}un;
un.i = 1;
return un.c;
}
int main(void)
{
if(check()==1)
printf("小端模式存储!\n");
else
printf("大端模式存储!\n");
return 0;
}
检测方法二
#include
int check()
{
int i = 1;
i = *(char*)&i;//取 i 的地址 强制类型转换后解引用
return i;
}
int main(void)
{
if(check()==1)
printf("小端模式存储!\n");
else
printf("大端模式存储!\n");
return 0;
}
检测方法三
#include
int check()
{
union UN
{
char a [4];
int i ;
} un ;
un .i = 1;
//02 是整数不够2位就补上0 x是以16进制输出 hhx 表示只输出两位
printf ("%02hhx %02hhx %02hhx %02hhx\n", un .a [0], un. a [1],un . a[2], un .a [3]);
return un . a[0];
}
int main(void)
{
if(check()==1)
printf("小端模式存储!\n");
else
printf("大端模式存储!\n");
return 0;
}
手撕实现小端转大端函数
UINT32 LE2BE(UINT8 *dat,UINT8 len)
{
UINT32 temp=0,fact=1;
UINT8 i=0;
for(i=0;i { temp+=dat[i]*fact; fact*=256; } return temp; }