大端模式、小端模式、高字节序、低字节序、MSB、LSB

2023-05-16

https://blog.51cto.com/u_14114084/4930969#:~:text=%E9%AB%98%E4%BD%8D%E5%85%88%E8%A1%8C%E5%8D%B3%E5%9C%A8%E4%BC%A0%E8%BE%93,%E4%BC%A0%E8%BE%93%E4%BD%8E%E4%BD%8Dlsb%E3%80%82

摘要: 你知道内存是怎么读取数据的吗?知道数据是怎么一个一个字节发送的吗?是低字节先发还是高字节先发?是bit0先发还是bit7先发?是从低地址开始读还是从高地址开始读?看完本篇比应该就明白了~

内存的读写永远从低地址开始读/写,从低到高!从低到高!从低到高!重要的话说三遍

大端模式和小端模式
大端模式和小端是实际的字节顺序和存储的地址顺序对应关系的两种模式。
在这里插入图片描述
大端模式:高位字节存放在低地址中,低位字节存放在高地址中。最直观的字节序。

小端模式:高位字节存放在高地址中,低位字节存放在低地址中。最符合人的思维的字节序,x86、ARM都这么搞(KEIL C51中,变量都是大端模式的;KEIL MDK中,变量是小端模式的。)。

用图表示更加容易理解。以​​unsigned int value = 0x12345678​​为例,分别按照大端模式和小端模式存放在芯片中。
在这里插入图片描述
再换一种图示:同样以​​unsigned int value = 0x12345678​​​为例,分别看看在两种字节序下其存储情况,我们可以用​​unsigned char buf[4]​​​来表示​​value​​。
在这里插入图片描述
不管是大端还是小端模式,我们在读取和存储数据的时候一定都是从内存的低地址依次向高地址读取或写入。另外注意,x86平台是小端的,ARM平台是小端的,而PowerPC平台是大端的。

字节高低位

一般左边为高位,右边为低位(这个高低来自于人类的阅读习惯,数字从左向右,表示由大到小)

一个16位(双字节)的数据,比如​​0xFF1A​​,那么高位字节就是​​0xFF​​,低位是​​0x1A​​。

如果是32位的数据,比如​​0x3F68415B​​。高位字(不是字节)是​​0x3F68​​,低位字是​​0x415B​​。

右边是低位位,左边是高位(人的阅读习惯)

LSB和MSB

最高有效位(most mignificant bit,msb)指的是一个n位二进制数字中的n-1位,具有最高的权值2^(n-1)。 有时也指Most Significant Byte(MSB),指多字节序列中具有最大权重的字节。

同理,最低有效位(least significant bit,lsb)和的是一个n位二进制数字中的0位,具有最低的权值2^0。有时也指Least Significant Byte(LSB),指多字节序列中具有最小权重的字节。

所以0x12345678的最高有效字节就是0x12,最低有效字节就是0x78,这样明白了吧!

举个栗子
当选择模数转换器(ADC)时,最低有效位(LSB)这一参数的含义是什么?

对于一个12位串行转换器,它会输出由1或0组成的12位数串。通常,转换器首先送出的是最高有效位(MSB)(即LSB + 11)。有些转换器也会先送出LSB。我们假设先送出的是MSB,然后依次送出MSB-1 (即 LSB + 10)和MSB -2(即LSB + 9)并依次类推。转换器最终送出MSB -11(即LSB)作为位串的末位。

LSB这一术语有着特定的含义,它表示的是数字流中的最后一位,也表示组成满量程输入范围的最小单位。对于12位转换器来说,LSB的值相当于模拟信号满量程输入范围除以2^12 或 4096的商。如果用真实的数字来表示的话,对于满量程输入范围为4.096V的情况,一个12位转换器对应的LSB大小为1mV。但是,将LSB定义为4096个可能编码中的一个编码对于我们的理解是有好处的。

在这里插入图片描述

高位先行msb 、低位先行lsb

高位先行即在传输一个字节的时候先传输高位msb;低位先行即在传输一个字节的时候先传输低位lsb。高位先行和低位先行是针对串行数据传输方式来说的。常见的串行传输方式有串口(UAR)、I2C、SPI等。以串口传输方式为例,标准的串口传输方式是低位先行,芯片在通过TX引脚发送数据时,依次发送位0、位1……位7。

串口传输是低位先行
UART在数据传输时,协议规定了数据传输必须是低位先行,看下面的时序图你就知道了~
在这里插入图片描述

IIC传输是高位先行

IIC的数据和地址均以8位字节传输,MSB 在前。从图中可以清楚地看到:
在这里插入图片描述
这一点也反映在代码中,我们随便找一个IIC的读字节和写字节的函数看看:

void i2c_SendByte(uint8_t _ucByte)
{
  uint8_t i;
  /* 先发送字节的高位bit7 */
  for (i = 0; i < 8; i++)
  {   
    if (_ucByte & 0x80)
    {
      I2C_SDA_1();
    }
    else
    {
      I2C_SDA_0();
    }
    i2c_Delay();
    I2C_SCL_1();
    i2c_Delay();  
    I2C_SCL_0();
    if (i == 7)
    {
       I2C_SDA_1(); // 释放总线
    }
    _ucByte <<= 1;  /* 左移一个bit */
    i2c_Delay();
  }
}

从第7行代码中可以看到,在发送一个字节时,首先将要发送的字节与0x80进行与运算,取出最高位,然后循环左移8次就可以将一个字节数据发送出去了。你有没有想过为什么这里我们不把要发送的字节与0x01进行与运算,取出最低位,然后循环右移8次也可以将一个字节数据发送出去呢?

答:因为我们说了I2C在数据传输时,协议规定了数据传输必须是高位先行,所以你要发送一个字节的数据肯定必须先取出最高位,然后循环左移将数据发出,如果你与上0x01,就是低位先行,虽然你也将一个字节发出去了,但是你发的是歪门邪道的数据,人家单片机也不认识,对吧?你品,你细品~

同样在接收一个字节时,接收到的第1位认为是最高位,接收一个字节代码如下:

uint8_t i2c_ReadByte(void)
{
  uint8_t i;
  uint8_t value;
  /* 读到第1个bit为数据的bit7 */
  value = 0;
  for (i = 0; i < 8; i++)
  {
    value <<= 1;
    I2C_SCL_1();
    i2c_Delay();
    if (I2C_SDA_READ())
    {
      value++;
    }
    I2C_SCL_0();
    i2c_Delay();
  }
  return value;
}

所有使用I2C的设备必须遵循I2C协议,必须都是高位先行的,这样才能实现通用性。怎么样?是不是又get到了一个小技巧~

字节序、比特序
字节序就是串行发送多字节时发送的顺序,比如value=0x12345678,按字节发送是0x12、0x34、0x56、0x78顺序还是0x78、0x56、0x34、0x12顺序。

同理,比特序在bit层面进行排序,如果一个字节,指先发bit0还是bit7, 如果是一个Word型,先发bit31还是先发bit0

串口是lsb优先,I2C是msb优先,这里的msb、lsb指的是比特序,二进制位的位置。区别于【字节序】通信中,先发送低字节,还是高字节的问题,那是字节序的MSB还是LSB,当然也有人混称上面所说的为大端发送big-endian、小端发送little-endian

验证MCU平台存储方式?
这里以STM32开发单片机的keil平台为例,以下代码如果打印0x04就是小端存储,如果0x01则是大端存储。

因为0x04是低字节,读取数据是从低地址开始读,打印的是data的低地址,所以如果打印出的是0x04就表明低地址存储低字节,就为小端存储。明白了吗?
在这里插入图片描述

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "SEGGER_RTT.h"
#include "math.h"

int main(void)
{
  HAL_Init();                 //初始化HAL库    
  Stm32_Clock_Init(8,336,2,7);//设置时钟,168Mhz
  delay_init(168);            //初始化延时函数
  while(1)
  {  
    uint32_t data =0x01020304;
    char *p = (char*)&data;
    printf("0x0%x\n",*p);//看输出的是0x01还是0x04
    delay_ms(1000);
  }
}

编译、链接、下载,通过RTT查看试验结果:
在这里插入图片描述
可以看出STM32是小端存储。

总结:内存的读写永远从低地址开始读/写。大小端存储指字节在内存存储方式,X86、ARM平台都是小端存储(低-低),MSB/LSB只发送字节序或者比特序,串口是比特序LSB,IIC是比特序MSB。也有人将MSB、big-endian、大端发送都混为一谈,这时候一般指字节序上MSB。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大端模式、小端模式、高字节序、低字节序、MSB、LSB 的相关文章

  • 时间序列异常检测综述

    1 Introduction 时序异常检测几个可以运用的点 xff1a 1 欺诈检测 2 工业数据检测 简介一下 xff1a 异常检测很久之前就有了 最早可以追溯到 J Fox 1972 Outliers in Time Series Jo
  • Linux基础----Makefile(1)

    前言 刚开始学习Linux xff0c 这些那真的是新知识 xff0c 由于感觉将来FPGA的学习会越来越靠近软件的方向发展 xff0c 所以觉得有必要好好地学习一下嵌入式的东西 xff0c 因此有必要把学习的过程记录下来 xff0c 方便
  • 【OpenCV】ChArUco标定板角点的检测Detection of ChArUco Corners

    opencv3 4 15源文档链接 link ChArUco标定板角点的检测 GoalSource codeCharuco板创建ChArUco板检测ChArUco姿势估计 ArUco标记和板的快速检测和多功能性是非常有用的 然而 xff0c
  • 错误 MSB3721

    错误 MSB3721 命令 C Program Files NVIDIA GPU Computing Toolkit CUDA v10 2 bin nvcc exe gencode 61 arch 61 compute 30 code 61
  • 倒立摆状态反馈控制——分析、建模与仿真(matlab)

    倒立摆状态反馈控制 引言 倒立摆是机器人学中一个非常重要的模型 xff0c 火箭 导弹 独轮车 双足机器人 四足机器人 xff0c 基本都是倒立摆的变形 问题描述 关于倒立摆的问题描述如下 xff1a 如图所示的倒立摆系统 摆的关节连接在一
  • docker pull rabbitmq:management 怎样指定版本

    docker pull rabbitmq 3 8 1 management
  • git 命令学习

    git 命令学习 git clone https github com zhaji01 notes git 克隆远程仓库 git status 本地仓库状态 git add lt file gt 把修改 xff08 包括创建 修改 删除 解
  • 【实例记录】在ubuntu上运行python实现与单片机多线程串口通信

    文章目录 工具步骤 工具 工具 xff1a 自己电脑双系统的ubuntu18 04 单片机esp8266 一个usb转ttl模块 xff0c ubuntu上已经下载了python的3 6和pip xff0c 还需要pip install s
  • 【过程记录 】windows和ubuntu两台电脑局域网进行socket通信收发数据和传输文件

    实验图片和前期准备 xff1a ubuntu作为服务端 xff0c windows客户端传输数据和文件 xff1a windows作为服务端 xff0c ubuntu作为客户端 xff1a 实验图片和前期准备 xff1a 服务端发送和接受i
  • 过程记录 yolov3目标检测输出目标坐标和原图物体像素坐标比较

    设备 xff1a jetsonnano B01 一个usb广角摄像头 语言为python 库为opencv 框架pytorch 大家都知道yolov3的坐标变换过程比较复杂 xff0c 大概要经过图片缩放 xff0c 对数空间变换等等 xf
  • Rt-Thread学习笔记-----信号量(五)

    线程间同步 1 什么是线程间同步 xff1f 同步是指按预定的先后次序进行运行 xff0c 线程同步是指多个线程通过特定的机制来控制线程之间的执行顺序 xff0c 也可以说是在线程之间通过同步建立起执行顺序的关系 xff0c 如果没有同步
  • C++类和对象——空指针访问成员函数

    C 43 43 中空指针也是可以访问成员函数的 xff0c 但是也要注意有没有用到this指针 xff1b 如果用到this指针 xff0c 需要加以判断保证代码的健壮性 span class token macro property sp
  • nodejs实现简单的自动化部署

    如题 xff0c nodejs通过码云提供的web hooks实现简单的服务器自动部署 大致流程 xff1a 1 通过码云提供的web hooks xff0c 创建一个request通过后的回调接口 xff08 说白了就是配置一个码云审批通
  • 2022届春招实习面经(CV岗)——offer经

    已拿offer公司 xff1a 腾讯 ponyai vivo研究院 华为 字节 面了一面就没继续面了 xff1a 海康威视 虎牙 京东 本科211 xff0c 硕士985 二区在投论文 43 顶会下的top5比赛 43 小厂三个月实习经历
  • LeetCode刷题笔记 --- python

    目录 一 python交换两个变量的值1 1 使用tuple1 2 使用临时变量temp 二 python中 和 区别三 python列表的使用3 1 列表的基本操作3 2 列表实现栈操作3 3 列表实现排序3 4 列表的算法效率 四 py
  • 无人机高度控制

    这个第一次看就完全没看懂 xff0c 现在再看还是没看懂orz xff0c 而且定高还是重要的功能和考点 xff0c 详细分析一下程序吧 首先是表示高度信息的结构体 xff1a 数据结构声明 typedef struct float Z S
  • ssh_exchange_identification: Connection closed by remote host

    ssh exchange identification Connection closed by remote host 导致这个问题的原因有很多 xff0c 笔者是因为在ssh中设置了代理 xff0c 这个可以作为阅读者排查问题的一个点
  • 匿名无人机飞控代码整理5

    先跳过高度部分 xff0c 这里看location部分 可以看出来这部分也是直接与我们的循迹 追踪任务相关的 所以这部分的掌握应该很重要把 前面有很多暂时不需要看 xff0c flyctrl那个巨长 所以就先看速度环控制部分了 if swi
  • 匿名无人机飞控代码整理

    看了半天 xff0c 各部分都看得都很零散 xff0c 写的也很简略 xff0c 但目前为止还是无法对系统各部分做具体一点的整合 xff0c 今天试试看 1 先从主函数起 xff0c 进入主轮询函数 Main Task 这个主函数的调用就在
  • 一直没看的无人机定高

    除了定高的部分 xff0c 其他没看的还有一些控制函数 定高的原理的话 xff0c 也是利用了两级pid xff0c 按照原本的理解 xff0c 从外环开始看的话 xff0c 反馈高度比较容易获得 xff0c 就是激光测距得到的高度 期望高

随机推荐

  • 匿名无人机代码FlightCtrl简单分析

    这个flightCtrl文件 xff0c 是真的很长又很难 各种标志位啊 xff0c 判断啊 xff0c 开关啊 xff0c 逻辑判断啊什么的 xff0c 趁通宵把代码梳理一遍 这个文件里的函数虽不算最多 xff0c 但引用的头文件相当多
  • 简历—项目经验范例

    xff08 看着比较专业的一份项目经验样板 xff09 原文链接https mp weixin qq com s rxGTTVKryvYoyst jsayLw 项目一 米乐淘网上商城 项目名称 xff1a 米乐淘网上商城 开发环境 xff1
  • 家庭网络和路由器

    1 什么是家庭网络 xff1f 一个典型的家庭网络由多个设备组成 xff0c 且几乎所有的家庭网络都有一个路由器作为它们的中心设备 路由器连接到 Internet 连接 xff0c 然后与本地网络上的一台或多台计算机共享该连接 家庭网络通常
  • ROS动态调整PID

    64 动态调整PID ROS提供了一个专门用于动态调整参数的功能包dynamic reconfigure 它实现了动态配置参数的机制 我们先来创建一个功能包 添加相应的一些依赖 cd catkin ws src catkin create
  • CubeMX配置串口的程序烧入板子不跑的解决方法

    对于cubeMX配置串口 xff0c keil5编译通过的 xff0c 自己确定无问题的程序 xff0c 以ISP烧入 xff0c 烧入板子后无法运行的情况 xff0c 我暂时的解决策略是按住reset键点击 开始编程 xff0c 点击后松
  • realsense D455+ROS+OpenCV4.5完成目标距离检测

    ROS OpenCV 1 环境配置 1 1 realsense SDK2 0安装 通过官网找到最新的SDK包并下载 Intel RealSense SDK 2 0 解压安装包 xff08 librealsense 2 47 0 tar gz
  • 什么是 PID 控制器:工作原理及其应用

    什么是 PID 控制器 xff1a 工作原理及其应用 什么是PID控制器 xff1f 历史PID控制器框图PID控制器的工作P 控制器I 控制器D 控制器 PID控制器的类型开 关控制比例控制标准型PID控制器实时 PID 控制器 调优方法
  • 什么是缓冲区

    1 什么是缓冲区 缓冲区又称为缓存 xff0c 它是内存空间的一部分 也就是说 xff0c 在内存空间中预留了一定的存储空间 xff0c 这些存储空间用来缓冲输入或输出的数据 xff0c 这部分预留的空间就叫做缓冲区 缓冲区根据其对应的是输
  • FreeRTOS系统解析-1、FreeRTOS系统简介

    1 系统简介 不同的的多任务系统有不同的侧重点 以工作站和桌面电脑为例 xff1a 早期的处理器非常昂贵 xff0c 多以那时的多任务用于实现在单处理器上支持多用户 这类系统中的调度算法侧重于让每个用户 公平共享 处理器时间 随着处理器的功
  • 目标检测 YOLOv5 常见的边框(bounding box )坐标矩形框表示方法

    将txt格式的真值框 xff08 Ground Truth xff09 在原图上显示 具体过程坎坷 xff0c 以下博主提供了思路 xff0c 学习了yolo格式label的归一化和坐标求解 xff01 1 https blog csdn
  • momenta实习面经

    走的火箭计划内推 xff0c 链接https mp weixin qq com s zllOky0biV9zn1Qfbg4XZg 线上先做了一套题 xff0c 写的2小时但是打开界面发现倒计时有10小时 xff0c 于是悠哉悠哉慢慢做结果2
  • 树莓派4B + Ubuntu18.04 + RealSense SDK

    有段时间没写博客了 xff0c 今天心血来潮 xff0c 记录一下 我自己的配置在标题写的很清楚 xff0c 用的是ros1 安装步骤我是建议 xff1a ubuntu gt realsense SDK gt ros gt ros wrap
  • ubuntu18.04安装ROS Melodic(最详细配置)

    前期准备 61 61 设置软件源 xff1a 国外的 xff1a sudo sh c 39 echo 34 deb http packages ros org ros ubuntu lsb release sc main 34 gt etc
  • 3步搞定CSDN中代码背景颜色的修改

    1 进入内容管理 xff0c 点击最下方的博客设置 2 修改
  • 2019电赛--无人机题目OpenMV总结

    此文章在我的博客链接 xff1a https sublimerui top archives d508d500 html NOTES xff1a 上一篇相关博文 xff0c 准备阶段OpenMV学习笔记链接 xff1a https blog
  • 大疆精灵4RTK自定义三维航线规划(开源)

    大疆精灵4rtk是无人机摄影测量行业的一款里程碑式的产品 xff0c 极大地拓展了无人机摄影测量的应用领域 然而 xff0c 大疆官方只提供了有限的航线规划功能 xff0c 如带状航线 井字航线 xff0c 5向飞行 xff0c 仿地飞行等
  • docker拉取RabbitMq镜像并安装

    RabbitMQ安装入门篇 文章目录 前言一 Docker拉取RabbitMq镜像二 docker下启动RabbitMq容器三 查看RabbitMq是否启动总结 前言 这篇文章为了方便初学者入门 xff0c 在linux环境下用docker
  • 核间通信--Mailbox原理及内核驱动框架

    https blog csdn net weixin 34007291 article details 86026346 核间通信的主要目标是 xff1a 充分利用硬件提供的机制 xff0c 实现高效的CORE间通信 xff1b 给需要CO
  • mac下Wireshark报错: you don‘t have permission to capture on that device

    1 首先 首先 cd dev ls la grep bp 看见用户组 crw 1 root wheel 23 0 6 18 16 04 bpf0 crw 1 root wheel 23 1 6 20 04 20 bpf1 crw 1 roo
  • 大端模式、小端模式、高字节序、低字节序、MSB、LSB

    https blog 51cto com u 14114084 4930969 text 61 E9 AB 98 E4 BD 8D E5 85 88 E8 A1 8C E5 8D B3 E5 9C A8 E4 BC A0 E8 BE 93