大端模式和小端模式

大端和小端模式

大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。

小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。

一、大小端模式在存储器中存储方式

大小端模式在存储器中保存的方式如图一所示

clip_image002

图一

STM32的FLASH中数据保存的方式如图二、图三和图四所示:

FLASH地址0x0803E800中保存的数据为0xBB ,0x0803E801地址保存数据0xFF,0x0803E802地址保存数据0x01,0x0803E803地址保存数据0xFF;

所以,以unsigned char 类型读取地址0x0803E800的数据 (*(uint8_t *)(add))为 0xBB

clip_image004

图二 unsigned char 形式显示

以unsigned char 类型读取地址0x0803E800的数据 (*(uint16_t *)(add))为 0xFFBB

clip_image006

图三、以unsigned short 形式显示

以unsigned long 类型读取地址0x0803E800的数据 (*(uint32_t *)(add))为 0xFF01FFBB

clip_image007

图四、以unsigned long 形式显示

二、小端模式和数组或字符串

在涉及到数组和四个字节的unsigned long类型的赋值时,经常会涉及到正序和逆序的操作。

如M1卡的增值和减值操作时,传入的数据需要低位在前高位在后的数组方式。

Unsigned char value[4] ;

Unsigned long nValue = 0x01;

Memcpy(value , &nValue , 4); //value保存的数据为{0x01,0x00,0x00,0x00} 逆序方式

同样读出来的钱包的金额也是逆序的数组;

Unsigned char value[4] ; //读出的数是 {0x01,0x00,0x00,0x00}

Unsigned long nValue;

Memcpy(&nValue , value , 4); // nValue的值为 0x01;

因平时使用的X86平台、ARM平台都是小端模式,所以只以小端模式举例,网上都说C51是大端模式,我自己并没有去验证。

三、大、小端模式和TCP/IP网络数据传输

TCP/IP网络传输数据为大端模式,就是网络字节序,所以使用小端模式的平台进行网络数据传输时需要进行模式转换。

uint32_t htonl(uint32_t hostlong);//32位的主机字节序转换到网络字节序

uint16_t htons(uint16_t hostshort);//16位的主机字节序转换到网络字节序

uint32_t ntohl(uint32_t netlong);//32位的网络字节序转换到主机字节序

uint16_t ntohs(uint16_t netshort);//16位的网络字节序转换到主机字节序

 

浏览此文后,有错误和需要补充的地方,请留言评论!

posted on 2017-03-16 09:56  石中玉smulngy  阅读(939)  评论(0)    收藏  举报

导航