首页 > 其他分享 >清晰讲解LSB、MSB和大小端模式及网络字节序

清晰讲解LSB、MSB和大小端模式及网络字节序

时间:2022-12-13 13:01:14浏览次数:30  
标签:小端 LSB 字节 存放 内存 MSB

时隔一个月又回到了写文章,很开心O(∩_∩)O~~

今天在做需求的涉及到一个固件版本的概念,其中固件组的人谈到了版本号从​​MSB​​​到​​LSB​​排列,检索查阅后将所得整理如下。


 MSB、LSB?

MSB(Most Significant Bit):最高有效位,二进制中代表最高值的比特位,这一位对数值的影响最大。

LSB(Least Significant Bit):最低有效位,二进制中代表最低值的比特位

例如,在二进制的1001(十进制的9)中,最左边的“1”即是MSB对数值影响最大,从1到9的变化幅度。而最右边的1是LSB因为仅会让数值产生8到9的变化。

总结:MSB指二进制中表示的最高有效位,LSB指数据的最低有效位,1(MSB)001(LSB)


 大小端模式?

大端模式(Big-Endian):数据的高位字节放到内存的低地址端,低位字节放到内存的高地址端。

小端模式(Little-Endian):数据的低位字节放到内存的低地址端,高位字节放到内存的高地址端。

内存地址:它只是一个编号而已,代表一个内存空间。那么这个空间是多大呢?原来在计算机中存储器的容量是以字节为基本单位的。也就是说一个内存地址代表一个字节(8bit)的存储空间。

把数据放到内存中先放到低位地址编号在用高位地址编号。

如 0x0000-->0x0001-->0x0002-->0x0003

示例:假如现在有一个32位int型数0x12345678

上面讲到存储器已字节(8bit)为基本单位,那么32位的数在内存中就对应32/8=4,需要4个内存地址表示的内存空间去存储这个数据。

这个数的MSB为0x12, 
这个数的LSB 为0x78

OP0表示一个32位数据的最高字节MSB(Most Significant Byte),使用OP3表示一个32位数据最低字节LSB(Least Significant Byte)。

地址偏移

大端模式

小端模式

0x00

12(OP0)

78(OP3)

0x01

34(OP1)

56(OP2)

0x02

56(OP2)

34(OP1)

0x03

78(OP3)

12(OP0)

数据按照大端模式及小端模式在内存中存储的示意图如下

清晰讲解LSB、MSB和大小端模式及网络字节序_数据

区别:

采用大小模式对数据进行存放的主要区别在于在存放的字节顺序,大端方式将高位存放在低地址,小端方式将高位存放在高地址。

采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。

有的处理器系统采用了小端方式进行数据存放,如intel芯片是小端(修改分区表时要注意)。

有的处理器系统采用了大端方式进行数据存放,如IBM半导体和Freescale的PowerPC处理器以及一些常见的单片机芯片。不仅对于处理器,一些外设的设计中也存在着使用大端或者小端进行数据存放的选择。

特别的intel x86的CPU使用的是LE(Windows中称为“主机字节序”),而SocksAddr中使用的则是BE(就是“网络字节序”),所以在使用网络编程时需要使用htns,htnl,nths,nthl来倒字节序。


 网络字节序问题?

网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。

网络字节顺序采用big endian(大端)排序方式。

TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,这就要求发送端发送的第一个字节是高位字节;

而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节,即多字节数值在发送之前,在内存中因该是以大端法存放的。

网络字节序是确定的,明确以大端方式进行排序。但是,主机字节序有可能是按照大端存放(大端<--->大端,无需转换),也有可能按照小端存放(大端<--->小端,用特定函数进行转换)

 

 



清晰讲解LSB、MSB和大小端模式及网络字节序_小端模式_02

作者:​​翎野君​


若本文如对您有帮助,不妨点击一下右下角的。


如果您喜欢或希望看到更多我的文章,可扫描二维码关注我的微信公众号《翎野君》。


转载文章请务必保留出处和署名,否则保留追究法律责任的权利。



标签:小端,LSB,字节,存放,内存,MSB
From: https://blog.51cto.com/lingyejun/5933837

相关文章

  • js字符串转字节stringToByte
    functionstringToByte(str){varlen,c;len=str.length;varbytes=[];for(vari=0;i<len;i++){c=str.charCodeAt(i);......
  • 14 HotSpot将字节码变为机器码的过程
    目录1广义理解:解释执行与编译执行1HotSpot虚拟机基本介绍1为何HotSpot虚拟机要使用解释器与即时编译器并存的架构?2为何HotSpot虚拟机要实现两个(或三个)不同的即时编译器......
  • 字节流简述
    字节简述字节概述字节(byte)是计算机用于计量存储容量的一中计量单位。B(字节)KB(千字节)无论网络上两个终端需要传输什么数据,都需要传输二进制bit的数据。既然传输的都是b......
  • 0停机迁移Nacos?Java字节码技术来帮忙
    摘要:本文介绍如何将SpringCloud应用从开源Consul无缝迁移至华为云Nacos。本文分享自华为云社区《0停机迁移Nacos?Java字节码技术来帮忙》,作者:华为云PaaS服务小智。1.市场......
  • 浅谈字节码增强技术系列1-字节码增强概览
    作者:董子龙前言前段时间一直想参照lombok的实现原理写一篇可以生成业务单据修改记录插件的专利,再查阅资料的过程中,偶然了解到了字节码增强工具-byteBuddy。但是由于当时时间......
  • Java 字节码增强技术小记
    总结是什么:字节码增强技术用于对静态字节码文件进行修改或动态修改运行中的程序。使用场景有【动态代理、AOP、ORM框架】、【热部署、Mock测试、性能诊断工具】等,例如动......
  • 2021 届 字节跳动 校招提前批开始啦~~~
    又是一年校招季~~字节跳动的2021届校招提前批已经开始了~~因为疫情,今年各家公司的大规模校园宣讲多多少少都会受到影响。所以大家一定要特别关注校招的线上宣传活动,公众号......
  • glibc/gcc/gdb各版本发布时间以及rhel/centos默认glibc版本、lsb对应关系
    最近有些软件要求glibc2.14+,centos6.x自带的版本是2.12的,7.6默认是2.17,特查了下glibc各版本发布时间以及与对应的内核,如下:DateReleaseAnnouncement2017-08-01​​GLI......
  • io流之【字节/字符缓冲流】
    缓冲流,也叫高效流,是对4个基本的Filexxx流的增强,所以也是4个流,按照数据类型分类:字节缓冲流:BufferedInputStream,BufferedOutputStream字符缓冲流:BufferedReader,Buffered......
  • io流之字节流【基础流】
    ①字节输入流:读取文件中的数据packagecom.Lucky.io.byteStream;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.IOExceptio......