大端模式和小端模式详解
怎么去理解大端和小端?
1、大端和小端核心是什么?
大端模式和小端是实际的字节顺序和存储的地址顺序对应关系的两种模式,总结如下:
大端模式:低地址对应高字节
小端模式:低地址对应低字节
不管是大端还是小端模式,我们在读取和存储数据的时候一定都是从内存的低地址依次向高地址读取或写入。
2、什么是存储顺序?
打个比方,我们定义一个数组,char array[5] = {0,1,2,3,4};
学习过C语言应该都知道,array是这个数组存储的首地址,如果这个您也不知道,那我还是建议你去复习一下C语言,这是C语言最基本不过的内容了。
数组存储的内存分布如下:
存储地址 |
0x2000 3001 |
0x2000 3002 |
0x2000 3003 |
0x2000 3004 |
0x2000 3005 |
存储的值 |
0 |
1 |
2 |
3 |
4 |
不管是写还是读,我们都是只要根据这个首地址就能找到我们想要的元素内容,从这一点上讲,在存储的时候,我们依次去存储0、1、2、3、4。在读取的时候,我们也是从array[0]开始,依次读取0、1、2、3、4。
3、大端模式向小端模式发送数据
有了数据按照字节依次由低往高读取或存储这个前提,下面举例说明大端和小端的区别。
假设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
这里可能很多人会有疑问?不是读取是按照低地址从高地址依次读取的吗?为什么相同的存储,读出来的值却不一样了?
这里就是关键了。在读取0x12出来后,系统设定的模式是低地址对应低字节,我们的Value_B
是int类型,是四个字节的数据,展示在我们面前的数据,一定是从左到右字节的顺序依次降低的,所以将0x12放在最低的字节,如下图。
字节顺序 |
4 |
3 |
2 |
1 |
对应的字节的值 |
0x78 |
0x56 |
0x34 |
0x12 |
即Value_B = 0x78563412;
Value_A 不等于Value_B,这就是为什么我们在网络通信的时候一定要进行字节序和确认了,必须保证A和B的字节序相同,如果不同,就需要使用字节序的转换函数。
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)
主机字节序一般都是小端(绝大多数,少部分也是大端存储的),网络字节序是大端存储的。
5、小端转大端函数讲解和原理分析
下面是一个将小端转化为大端的函数:
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。
这里就需要按照上面进行转换。
上面的程序意图如下:
temp = 0x78*1 + 0x56*256 + 0x34 * 256*256 + 0x12*256*256*256
= 120+22016+3407872+301989888
= 305419896
= 0x12345678
经过转换,A获取的值就是temp值,也就是B传送过来的值了。
看到这里,就算是把大端和小端的问题说明白了,实际上的问题核心就是一个是字节顺序,一个存储顺序。
大端模式和小端模式详解相关推荐
- 嵌入式基础01【转载】详解大端模式和小端模式
---------------- 版权声明:本文为CSDN博主「ce123」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog. ...
- 详解大端模式和小端模式
详解大端模式和小端模式 嵌入式开发交流群280352802,欢迎加入! 一.大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的<格利佛游记& ...
- 详解大端模式和小端模式【转】
详解大端模式和小端模式 一.大端模式和小端模式的起源 本文转载自:http://blog.csdn.net/ce123/article/details/6971544 关于大端小端名词的由来,有一个有 ...
- 大端模式与小端模式的详解分析
大端序与小端序 何为大端序,小端序? 简单点说,就是字节的存储顺序,如果数据都是单字节的,那怎么存储无所谓了,但是对于多字节数据,比如int,double等,就要考虑存储的顺序了.注意字节序是硬件层面 ...
- 677-大端模式和小端模式详解
1.大端和小端核心是什么? 大端模式和小端是实际的字节顺序和存储的地址顺序对应关系的两种模式,总结如下: 大端模式:低地址对应高字节 小端模式:低地址对应低字节 不管是大端还是小端模式,我们在读取和存 ...
- 【转】大端模式与小端模式、网络字节顺序与主机字节顺序 (经典)
大端模式与小端模式 一.概念及详解 在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式. 先回顾两个关键词,MSB和LSB: ...
- 大端模式、小端模式、网络字节顺序与主机字节顺序
大端模式.小端模式.网络字节顺序与主机字节顺序 大端模式与小端模式 概念与详解 在各种体系的计算机中通常采用的字节存储机制主要有两种:big-endian和little-endian,即大端模式和小端 ...
- 大端模式和小端模式初探
大端模式和小端模式初探 大端模式和小端模式初探 字节序模式由来 什么是大端和小端 大端模式(Big-Endian) 小端模式(Little-Endian) 示例 优缺点 为什么会有大小端之分呢 如何判 ...
- 计算机大端模式和小端模式 内存对齐问题(sizeof)
目录(?)[+] 一大端模式和小端模式的起源 二什么是大端和小端 三数组在大端小端情况下的存储 四为什么会有大小端模式之分呢 五如何判断机器的字节序 内存对齐问题 再讲讲pragma pack 内存对 ...
最新文章
- Ciruy英雄谭 Chapter 1 序章
- 实现Singleton 模式——七种实现方式
- Intel Realsense 如何获取输入图像的分辨率参数?傻办法 asanyarray() shape() get_data()
- java 文件指定位置插入_java 中利用io流将一个文件插入到另一个文件中的指定位置,指定位置...
- UML类图10分钟快速入门
- ZOJ 3471 压缩状态DP
- 【清单】值得「等待」的12个指示加载状态的 js 库
- 开启未来十年的编码技术之门
- Spring BeanDefinition
- 前端学习(1857)vue之电商管理系统电商系统之配置api接口服务器并用postman调试接口
- “重疾险”和“重大疾病医疗保险”的区别
- Linux的ssh登录命令,linux命令SSH登录工具常用命令
- 行业大数据技术发展趋势
- 阿里-蚂蚁金服-一面电面-上海-java研发实习生
- 风之谷mobi-宫崎骏漫画kindle7本
- linux音乐应用程序,适用于节拍,循环,录音的最佳免费Linux音乐制作应用程序 | MOS86...
- ios越狱,impactor无法使用的替代方案
- 隐私计算加密技术基础系列-Diffie–Hellman key exchange
- 2020杭电计算机考研复试面试
- 示波器探头需要补偿校准的根本原因