大端模式和小端模式
大端和小端模式
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
一、大小端模式在存储器中存储方式
大小端模式在存储器中保存的方式如图一所示
图一
STM32的FLASH中数据保存的方式如图二、图三和图四所示:
FLASH地址0x0803E800中保存的数据为0xBB ,0x0803E801地址保存数据0xFF,0x0803E802地址保存数据0x01,0x0803E803地址保存数据0xFF;
所以,以unsigned char 类型读取地址0x0803E800的数据 (*(uint8_t *)(add))为 0xBB
图二 unsigned char 形式显示
以unsigned char 类型读取地址0x0803E800的数据 (*(uint16_t *)(add))为 0xFFBB
图三、以unsigned short 形式显示
以unsigned long 类型读取地址0x0803E800的数据 (*(uint32_t *)(add))为 0xFF01FFBB
图四、以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) 收藏 举报




浙公网安备 33010602011771号