大端vs小端——基础原理
大端 vs 小端
基础原理
最近有人问王师傅一个问题:车内通信如果涉及到CAN报文和以太网报文转换的场景,大端、小端,或者Intel、Motorola格式会对数据转换造成什么影响吗?相信大家都曾学习或者了解过什么是大端、小端,可总是过眼云烟,扭头就忘。今天,希望能通过几个简单的例子帮助大家对这块的内容有个更好的理解。内部比较多,会分三篇文章,分别从基础原理、网络字节序和Intel&Motorola格式三个部分来做介绍。
关键字:大端、小端、网络字节序、Intel、Motorola、车载以太网、CAN
Q&A
什么是大端和小端?
大端(Big-endian)和小端(Little-endian)指的是字节的顺序(ByteOrder),当数据在存储的时候,是最高有效字节(MostSignificantbyte:MSB)先存储还是最低有效字节(LeastSignificantByte:LSB)先存储。
最高有效字节(MSB):最大权重的字节,发生改变对数值影响最大。
最低有效字节(LSB):最小权重的字节,发生改变对数值影响最小。
举个例子
十六进制数字0x142857,该数字的MSB为0x14,LSB为0x57。
如果MSB减1,变成0x132857,数值会减少65535,数值改变较大——权重较大。
如果LSB减1,变成0x142856,数值仅减少1,数值改变较小——权重较小。
再举个例子
假如你有20001块钱,如果2变成了1,20001会变成10001,直接损失10000块;但如果1变成了0,20001会变成20000,仅损失1块,所以最左侧的2最重要(MostSignificant),最右侧的1最不重要(LeastSignificant)。
除了字节,比特(位)也有最高有效位 (MostSignificantBit,这里为了和字节的MSB做区分,在本文中将其表示为MSBit)和最低有效位 (LeastSignificantBit:LSBit)。
比如0b10100110,红色1为MSBit,绿色0为LSBit。
在数据存储时,每个存储单元都有一个自己的地址(比如16位机器的地址范围是0x0000~0xFFFF),每个地址存储1个字节的数据。如果我们想存储0x14285700,存储地址为0x1001至0x1004,大端小端的处理如下:
大端模式:最高有效字节先存储,即数据的最高有效字节(MSB)保存在内存的低地址中,而数据的最低有效字节(LSB)保存在内存的高地址中(和我们的阅读顺序一致)。
小端模式:最低有效字节先存储,即数据的低字节(LSB)保存在内存的低地址中,数据的高字节(MSB)保存在内存的高地址中。
另外,除了字节序,在每一个字节中,比特位也有自己的顺序,叫比特序或者位序(BitOrder)。下图为二进制数字0b10100110(166)在大小端中的表示:
大端,左侧为最高有效位MSBit,右侧为最低有效位LSBit。
小端,左侧为最低有效位LSBit,右侧为最高有效位MSBit。
在系统中,位序通常和字节序一致,内存的读写是从低地址开始,数据的收发也是一样,所以大端更符合人类的阅读顺序和习惯。
大端、小端的由来
大端、小端,这两个名词是1980年,由DannyCohen在他的文章《OnHolyWarsandaPleaforPeace》中引入到计算器领域的(这篇文章在网上可以搜到,大家有兴趣可以去看看,其中主要阐述了大小端的问题)。
最初的出处,是1726年出版的长篇小说《Gulliver’sTravels》,作者是JonathanSwift,小说中两个小人国Blefuscu和Lilliput之间因为鸡蛋应该从哪端打破而爆发了冲突,支持从大端(bigend)打鸡蛋的人被称为BigEndians,支持从小端(littleend)打鸡蛋的人被称为LittleEndians。这是一篇讽刺小说,其中讽刺了很多毫无意义的d派斗争。
DannyCohen之所以引用这两个名词,除了比较形象之外,可能是因为当时计算机具体应该使用大端还是小端在业内引起了不小的争论,他认为这些争论没有意义,就如他在文章结尾处说的:
Itismoreimportanttoagreeuponanorderthanwhichorderisagreedupon.Howabouttossingacoin?
《OnHoly Warsand aPleaforPeace》
今天就先分享这么多,这里介绍了大端和小端的基础知识。那么车内通信的时候是使用大端还是小端?Intel和Motorola格式和大小端又有什么关系呢?敬请期待接下来的文章。
封面图片作者 OliverWidder
图片来源 https://geek-and-poke.com
✦ +
+
彩蛋
文中举例时提到了一个数字142857
这个数字是十进制循环数
有人称它为走马灯数
大家有兴趣可以试着算一算
将这个数字分别乘以1到7
看看得到什么数字
142857 | 285714 | 428571
571428 | 714285 | 857142
999999
浅析数据存储中的大端模式和小端模式
一、什么是大端和小端
二、数组在大端小端情况下的存储
三、为什么会有大小端模式之分呢?
四、如何判断机器的字节序
五、常见的字节序
七、从软件的角度理解端模式
八、从系统的角度理解端模式
九、实际中的例子
热文推荐阅读
请问锥度螺纹大端和小端怎么算?
大端大中径=基面大中径+(刃长-基面长度)/锥度小端大中径=基面大中径-基面长度/锥度*锥度一般为1:16那么锥度数值就为16
计组中的大端,小端到底是数据存储方式还是地址指定方式
大端小端针对多字节数据存储时字节顺序而言的。所谓"littleendian",为intel所采用模式,数据的低字节存放在内存低地址中,高字节存放在高地址中,即学x86时说的“高高低低”原则。byte3byte2byte1byte0在内存中对应的是:baseaddress+0byte0baseaddress+1byte1baseaddress+2byte2baseaddress+3byte3所谓"bigendian",为moto所采用模式,数据的低字节存放在内存的高地址,数据的高字节存放在内存的低地址。byte3byte2byte1byte0在内存中对应的是:baseaddress+0byte3baseaddress+1byte2baseaddress+2byte1baseaddress+3byte0java使用的是大端序来存储数据。big—endian:即低字节的数据存储在高位内存上,如对于1234,12是高位数据,34为低位数据,则java中的存储格式应该为12存在内存的低地址,34存在内存的高地址,x86中的存储格式与之相反。
什么是大端和小端?_什么是大端什么是小端_Archer-的博客-CSDN博客
大端模式:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。
小端模式:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。
假如32位宽(uint32_t)的数据0x12345678,从地址0x08004000开始存放:
PLCcnmdCSDN:通电亮屏时,用万用表测每个脚的电压会影响吗
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
大端是什么意思?
基本解释
主要的部分;重要的端绪;大概。
故称恶者,心之大端也。——《礼记·礼运》
今略举大端,以喻吏民。——《后汉书·隗嚣传》
引证解释
主要的端绪。《礼记·礼运》:“故欲恶者,心之大端也。” 孔颖达 疏:“端谓头绪。”*** 《论持久战》三五:“依目前条件来看,战争趋势中的某些大端是可以指出的。”
谓事情的主要方面。《后汉书·隗嚣传》:“ 新都侯 王莽 ,慢侮天地、悖道逆理……今略举大端,以喻吏民。”唐 白居易《三教论衡》:“略录大端,不可具载。”梁启超 《中国积弱溯源记》第二节:“以上六者,仅举大端,自馀恶风,更仆难尽。”
本原。唐 陈子昂 《谏政理书》:“元气,天地之始,万物之祖,王政之大端也。”
大抵,大约。《西游记》第三五回:“那怪虽也能腾云驾雾,不过是些法术,大端是凡胎未脱,到於寳贝里就化了。”《中国歌谣资料·小曲》:“河那边一只凤,我怎么叫他不应?大端是我亲人少缘分。”
旧指统治者认为正统的思想、理论,一般指儒家学说。在中国古代,儒家称其他学说、学派为异端。清刘智编撰《天方典礼》:“婚姻为人道之大端,古今圣凡,皆不能越其礼而废其事也”。
如何判断CPU是大端模式还是小端模式
大端小端是和cpu类型有关的,如果不想获取cpu类型什么的来判断,可能通过htons或htonl之类的函数对比参数和返回值来判断,参数和返回值相同的是大端。
什么是大端序和小端序,为什么要有字节序_kevin_tech的博客-CSDN博客
字节序,又称端序或尾序(英语中用单词:Endianness表示),在计算机领域中,指电脑内存中或在数字通信链路中,占用多个字节的数据的字节排列顺序。
在几乎所有的平台上,多字节对象都被存储为连续的字节序列。例如在Go语言中,一个类型为int的变量x地址为0x100,那么其指针&x的值为0x100。且x的四个字节将被存储在内存的0x100,0x101,0x102,0x103位置。
字节的排列方式有两个通用规则:
大端序(Big-Endian)将数据的低位字节存放在内存的高位地址,高位字节存放在低位地址。这种排列方式与数据用字节表示时的书写顺序一致,符合人类的阅读习惯。
小端序(Little-Endian),将一个多位数的低位放在较小的地址处,高位放在较大的地址处,则称小端序。小端序与人类的阅读习惯相反,但更符合计算机读取内存的方式,因为CPU读取内存中的数据时,是从低地址向高地址方向进行读取的。
上面的文字描述有点抽象,我们拿一个例子来解释一下字节排列时的大端序和小端序。
在内存中存放整型数值168496141需要4个字节,这个数值的对应的16进制表示是0X0A0B0C0D,这个数值在用大端序和小端序排列时的在内存中的示意图如下:
很多人会问,为什么会有字节序,统一用大端序不行吗?答案是,计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。在计算机内部,小端序被广泛应用于现代CPU内部存储数据;而在其他场景,比如网络传输和文件存储则使用大端序。
Go语言存储数据时的字节序依赖所在平台的CPU,处理大小端序的代码位于encoding/binary,包中的全*变量BigEndian用于操作大端序数据,LittleEndian用于操作小端序数据,这两个变量所对应的数据类型都实现了ByteOrder接口。
计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。但是,人类还是习惯读写大端字节序。所以,除了计算机的内部处理,其他的场合比如网络传输和文件储存,几乎都是用的大端字节序。正是因为这些原因才有了字节序。
计算机处理字节序的时候,如果是大端字节序,先读到的就是高位字节,后读到的就是低位字节。小端字节序则正好相反。
宇瞳:哪里有误?你的说法和博主的说法及图解不是一模一样吗
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
判断计算机是大端还是小端
#includeintmain(){unsignedcharstr[4]={1,0,0,0};unsignedint*i=(unsignedint*)str;if(*i==1)printf("Little_endian ");elseif(*i==)printf("Big_endian ");return0;}另外,共用体也可以拿来判断
什么是MSB、LSB?和大端、小端是否是一个概念?
MSB是MostSignificantBit的缩写,最高有效位。在二进制数中,MSB是最高加权位。与十进制数字中最左边的一位类似。通常,MSB位于二进制数的最左侧,LSB位于二进制数的最右侧。LSB(LeastSignificantBit),意为最低有效位;MSB(MostSignificantBit),意为最高有效位。计算机业界,端表示数据在存储器中的存放顺序。大端与小端是两种数据的存储方式!大端方式将高位存放在低地址,小端方式将高位存放在高地址。(比如将16位数0x1234存放在地址0x00,0x01两个连续地址中时,按照大端方式应该0x00中存放0x12,而0x01中存放0x34,小端方式0x00中存放0x34,而x01中存放0x12)
转载请注明出处品达科技 » 什么是大端什么是小端(大端vs小端——基础原理)