大小端转换(一篇文章了解所有情况下的大小端转换方法) |
您所在的位置:网站首页 › 字节和比特的换算方法 › 大小端转换(一篇文章了解所有情况下的大小端转换方法) |
总述: 字节间字节内大端低地址的数据放在高字节位域:先从低地址对应数据字节的高bit开始分配小端低地址的数据放在低字节位域:先从低地址对应数据字节的低bit开始分配注释: 对于大小端的几个结论: 1.char型变量和char型数组没有大小端的区分。 2.需要转化数据类型大于1个字节的数据类型:short,int,枚举,联合体等。 一.为什么要进行大小端转化? 简单说一下为什么要进行大小端转化:目前我接触到的,arm是小端,dsp是大端,电脑是小段,网络数据一般为大端,当arm需要和dsp通信的时候就会存在大小端转化的问题,每种芯片为什么选用大小端的由来就不赘述了。 二、字节间的大小端转化: 1,举例说明字节间的大小端: 内存中有如下一段数据(unsigned int 型),不同的大小端对这个段数据的理解不同,所以在我们实际工作中,当你查看到内存中的数据时候,首先要清楚这个处理器的大小端,才能理解这段数实际代表的值。 内存地址0x000040000x000040010x000040020x000040030X120x340x560X78如果是大端处理器:这段数代表:0x12345678;如果是小段处理器:这段数代表:0x78563412 ; 内存中有如下一段数据(unsigned short 型): 内存地址0x000040000x000040010X120x34如果是大端处理器:这段数代表的值:0x1234; 如果是小段处理器:这段数代表的值:0x3412 ; 在两个不同大小端的处理器之间数据传输,数据再内存的存放顺序并没有变,不同大小端需要解读出通用的值,就需要进行大小端转化。 2,C语言大小端转化调用库函数: htonlhost to network ,l代表unsigned long型 也可以看成unsigned inthtonshost to network ,s代表unsigned short型ntohlnetwork to host ,l代表unsigned long型 也可以看成unsigned intntohsnetwork to host ,s代表unsigned short型在网络传输中,一般要求是大端,而inter处理器是小端,network to host理解为大端转小端,而host to network 理解为小端转大端,本质上大端小端的转化算法是一致的,没有区别,3.代码验证: /* *程序说明:大小端字节间转化的一个案例 *作者 :通信小卒 *时间 :2019.8.25 */ #include #include #pragma comment(lib,"ws2_32.lib") int main(void) { unsigned int ultest=0x12345678; unsigned short ustest=0x1234; printf("ultest小端:%x\n",ultest); printf("ustest小端:%x\n",ustest); ultest=htonl(ultest);/*unsigned int 大小端转化*/ ustest=htons(ustest);/*unsigned short 大小端转化*/ printf("ultest大端:%x\n",ultest); printf("ustest大端:%x\n",ustest); while(1); }
处理LOCAL_ENDIAN 不同,其他代码完全相同,在大小端不同的处理器上运行此代码,分析内存情况: 2.1在小端处理器下看内存(#define LOCAL_ENDIAN 1 ): 地址0X004AFC140X004AFC150X004AFC160X004AFC17数据十六进制D7B9DBE4数据二进制11010111101110011101101111100100跨字节的部分需要特别注意:在这里插入图片描述小端数据为:0x E4BDB9D7, 现将数据进行翻转看,然后从底地址数据开始读:![]() 可以看出小端是从底地址的字节的底bit位开始分配。 2.2在大端处理器运行看内存(#define LOCAL_ENDIAN 0): 地址0X004AFC140X004AFC150X004AFC160X004AFC17数据十六进制E4DBB9D7数据二进制11100100110110111011100111010111跨字节的部分需要特别注意:![]() |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |