首页
学习
活动
专区
圈层
工具
发布
44 篇文章
1
[PyUserInput]模拟鼠标和键盘模拟
2
银行排队模拟(离散事件模拟)
3
Linux网络模拟
4
Linux TC(Traffic Control)作为损伤仪的基础配置和使用
5
深入学习Docker网络(看这篇就完全够了)
6
【鸿蒙 HarmonyOS】鸿蒙手机模拟器 ( 鸿蒙远程模拟器 | 鸿蒙远程模拟器运行手机应用 )
7
探索嵌入式应用框架(EAF)
8
多 OS 混合部署框架
9
嵌入式系统架构浅谈:编程设计模式 (一)---访问硬件的设计模式
10
事件驱动和消息驱动
11
原来 8 张图,就能学废 Reactor 和 Proactor
12
Linux df -h 命令hang住没有反应
13
kafka消费组信息采集异常(hang住)排查
14
ext4 io hung模拟脚本
15
解决 umount 命令卸载磁盘时busy/卡死的问题
16
程序卡死在void HardFault_Handler的解决办法
17
执行sed命令卡死CPU消耗100%一例分析
18
记一次因Redis使用不当导致应用卡死过程
19
字节对齐不慎引发的挂死问题
20
解引用NULL为什么会导致程序挂死?
21
记64位地址截断引发的挂死问题
22
websocket 在线工具_websocket添加请求头
23
【嵌入式Linux应用开发】SquareLine Studio与LVGL模拟器
24
详解Handler机制中消息队列的出队逻辑
25
Android UpdateEngine模块流程(含序列图)
26
物联网时代的嵌入式开发平台
27
400+条实用C/C++框架、库、工具整理 ,你能想到的都在这里了
28
ESP32芯片IO解读
29
M5Stack在ubuntu上进行开发编译
30
【抽象那些事】不完整的抽象&多方面抽象&未用的抽象&重复的抽象
31
H264,你不知道的小技巧
32
linux 创建虚拟块设备,制作文件系统并挂载,用于测试lustre
33
基于linux开发uvc摄像头_uvc协议扩展
34
清晰讲解LSB、MSB和大小端模式及网络字节序
35
在树莓派中使用 MicroPython 接入 MQTT
36
MicroPython 玩转硬件系列1:环境搭建
37
嵌入式系统架构浅谈:编程设计模式 (二)---嵌入并发和资源管理的设计模式
38
嵌入式软件架构设计之分层设计
39
IC之路(一)Proteus-Arduino仿真环境搭建
40
图像处理基础(六)-libjpeg常用算法
41
OpenCV双目标定
42
L-K光流推导及OpenCV代码实现
43
NDI Webcam Input工具,那些你不知道的知识!
44
使用QEMU chroot进行固件本地调试
清单首页其它文章详情

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

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

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


 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)

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

区别:

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

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

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

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

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


 网络字节序问题?

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

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

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

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

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

参考文章:

https://www.cnblogs.com/VIPler/p/4282584.html

http://blog.csdn.net/gatieme/article/details/50642756

下一篇
举报
领券