1.大端和小端的核心:

大端模式和小端模式是实际的字节顺序存储的地址顺序对应的关系的两种模,总结如下:

大端模式:低地址对应高字节

小端模式:低地址对应低字节

2.大端模式向小端模式发送数据:

A大端存储模式

假设A要发送四字节的数据给B,A的存储是按照大端模式,B的存储模式为小端模式。

A的存储1234内存分布如下图

存储地址 0x2000 4001 0x2000 4002 0x2000 4003 0x2000 4004
存储的值 0x12 0x34 0x56 0x78

因为A存储是按照大端模式,依据低地址对应高字节的规律,那么A要发送值int Value_A = 0x12345678。

Value_A将会由低地址依次发送给B,这里为什么是低地址,因为发送的开始,就是去读取数据,读取数据一定是从低地址开始读取得,那么B依次接收的值为0x12,0x34,0x560,x78。

B将接收到的值存储在如下图的内存中,存储的时候也是按照低地址往高地址开始依次存储

存储地址 0x2000 8001 0x2000 8002 0x2000 8003 0x2000 8004
存储的值 0x12 0x34 0x56 0x78

B接收完毕后,需要将内存中的值读取到Value_B中来,那么Value_B的值是多少呢?

B的存储是按照小端模式存储,低地址对应的低字节,那么int Value_B = 0x78563412

3.小端转大端函数讲解和原理分析

下面是一个将小端转化为大端的函数:

1
2
3
4
5
6
7
8
9
10
11
UINT32  LE2BE(UINT8 *dat,UINT8  len)
{
UINT32 temp=0,fact=1;
UINT8 i=0;
for(i=0;i<len;i++)
{
temp+=dat[i]*fact;
fact*=256;
}
return temp;
}

这段程序是什么意思呢?

我们还是举例说明。

在上面的案例中,如果B要给A发送int test_B = 0x12345678,B的存储就是小端模式,B要将0x12345678正确的发送给A,那么按照上面的发送和接收,A是不会接收到0x12345678的。

A会依次接收到0x78,0x56,0x34,0x12,不经过转换,低地址对应高字节,test_A = 0x78563412。

这里就需要按照上面进行转换。

上面的程序意图如下:

1
2
3
4
temp = 0x78*1 + 0x56*256 + 0x34 * 256*256 + 0x12*256*256*256
= 120+22016+3407872+301989888
= 305419896
= 0x12345678

经过转换,A获取的值就是temp值,也就是B传送过来的值了。

看到这里,就算是把大端和小端的问题说明白了,实际上的问题核心就是一个是字节顺序,一个存储顺序。