大端模式与小端模式的理解以及判断方法
1. 为什么会有大端模式和小端模式
在计算机中,我们知道数据是按照字节存储
的,如果数据都是单字节存储,就不涉及存储顺序的问题。但是,大多数情况下,数据不是按照单字节的方式存储的,例如会有类似于int,double等数据类型,这就涉及到存储顺序的问题了,于是也就出现了两种存储方:大端模式(big endian)和小端模式(little endian)
。
我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。
2. 大端模式与小端模式的存储方式
- 大端模式(顺序):高字节在前(高字节存放在地址的低端),低字节在后
- 小端模式:高字节在后,低字节在前
- 大端模式的优点:符号位的判定固定为第一个字节,
容易判断正负
。 - 小端模式的优点:强制转换数据
不需要调整字节
内容
2.1 举例说明一
以0x1234为例进行说明。
地址 | 0x4000(低地址) | 0x4001(高地址) |
---|---|---|
大端存储 | 0x12 | 0x34 |
小端存储 | 0x34 | 0x12 |
2.2 举例说明二
下面来看看数组
在大端模式和小端模式的存储区别,以unsigned int value = 0x12345678进行说明,假设有unsigned char buf[4]的一个数组。
- 大端模式
buf[3] (0x78) – 高地址,存放低位(字节)
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) – 低地址,存放高位(字节)
低地址 -----------------> 高地址
0x12 | 0x34 | 0x56 | 0x78
- 小端模式
buf[3] (0x12) – 高地址,存放高位(字节)
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) – 低地址,存放低位(字节)
低地址 ------------------> 高地址
0x78 | 0x56 | 0x34 | 0x12
可见,大端模式和字符串的存储模式类似。
3. 用代码判断大端和小端
3.1 union判断
使用union类型共享内存的判断方法。联合体union的存放顺序是所有成员都从低地址开始存放
bool IsBigEndian()
{union{unsigned short a ;//2个字节char b ;//高地址} c;c.a =0x0102 ;if(c.b ==1)//如果高地址存放低字节return true ;elsereturn false ;
}
3.2 int判断法
直接取int类型的高地址
bool IsBigEndian()
{int a =1 ; if(((char*)&a)[3] ==1)//直接取高地址return true ;elsereturn false ;
}
4. Intel格式与Motorola格式
在进行CAN总线通信设计或者测试过程中,经常看到CAN总线信号的编码格式有两种定义:Intel格式与Motorola格式。Motorola是大端字节序,Intel是小端字节序
。
4.1 CAN报文
CAN总线上有4种报文:数据帧、远程帧、错误帧、超载帧。其中只有数据帧真正承载数据。假设报文中含有8各字节的数据,共8*8 = 64 bit
。
- 如果位编号从右至左(R2L),那么:
7 6 5 4 3 2 1 0
--------------------------------| 0| 1| 2| 3| 4| 5| 6| 7
- 如果位编号从左至右(L2R),那么:
0 1 2 3 4 5 6 7
--------------------------------| 0| 1| 2| 3| 4| 5| 6| 7
这两种编号方式中,字节的编号是一样的,位的编号不同
。CAN报文是串行发送的,CAN节点在发送报文时,不论如何编号,总是从表的左上第一位开始发送。从左至右,从上至下
。
4.2 Intel格式与Motorola格式排列
使用<
或者>
表示信号的衔接点。
- Intel格式
Intel格式的信号的每位,从MSB(高字节)到LSB(低字节),按照从右至左,从上至下的顺序排列(向右上角塞)
x x x x x x x x
--------------------------------
>.. ... ... ... ... ... ... MSB | 0LSB ... ... ..> | 1| 2| 3| 4| 5| 6| 7
- Motorola格式
而Motorola格式的信号,从MSB(高字节)到LSB(低字节),按照每位从左至右,从上至下排列(向左上角塞)
x x x x x x x x
--------------------------------
MSB ... ... ... ... ... ... ..< | 0
<.. ... ... LSB | 1| 2| 3| 4| 5| 6| 7
从上面可以看出,Motorola格式对can报文的解析更加友好。
5. 大端数据解析示例
解析方法:
以速度为例,如果速度为负值
,需要对speed或0xF800,因为要取反+1,对不需要的数据补上1
,防止对要解析的数据造成影响。如果是满字节,不管正数还是负数,也就无所谓补1了
。
//目标信息结构体
typedef struct
{uint64_t snr : 8; //SNRuint64_t dynProp : 3; //运动状态uint64_t resv : 2;uint64_t latVel : 9; //横向速度uint64_t angle : 10; //角度uint64_t velocity : 11; //速度uint64_t range : 13; //距离uint64_t objId : 8; //目标ID
}stObjInfoMsg;//buf为待解析的8个字节
uint8_t * ptr = (uint8_t *)(buf);uint64_t msgdata = ((uint64_t)ptr[0] << 56) | ((uint64_t)ptr[1] << 48)| ((uint64_t)ptr[2] << 40) | ((uint64_t)ptr[3] << 32)| ((uint64_t)ptr[4] << 24) | ((uint64_t)ptr[5] << 16)| ((uint64_t)ptr[6] << 8) | ((uint64_t)ptr[7] << 0);stObjInfoMsg *pMsg = (stObjInfoMsg *)&msgdata;m_ID = pMsg->objId;m_Range = (float)pMsg->range / 5;m_Speed = pMsg->velocity & 0x400 ? (float)((int16_t)(pMsg->velocity | 0xF800)) / 5: (float)((int16_t)(pMsg->velocity & 0x3FF)) / 5;m_Angle = pMsg->angle & 0x200 ? (float)((int16_t)(pMsg->angle | 0xFC00)) / 4: (float)((int16_t)(pMsg->angle & 0x1FF)) / 4;
大端模式与小端模式的理解以及判断方法相关推荐
- 大端模式与小端模式的详解分析
大端序与小端序 何为大端序,小端序? 简单点说,就是字节的存储顺序,如果数据都是单字节的,那怎么存储无所谓了,但是对于多字节数据,比如int,double等,就要考虑存储的顺序了.注意字节序是硬件层面 ...
- 嵌入式基础01【转载】详解大端模式和小端模式
---------------- 版权声明:本文为CSDN博主「ce123」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog. ...
- 大端模式和小端模式详解
怎么去理解大端和小端? 1.大端和小端核心是什么? 大端模式和小端是实际的字节顺序和存储的地址顺序对应关系的两种模式,总结如下: 大端模式:低地址对应高字节 小端模式:低地址对应低字节 不管是大端还是 ...
- 大端模式、小端模式、高字节序、低字节序、MSB、LSB
摘要:你知道内存是怎么读取数据的吗?知道数据是怎么一个一个字节发送的吗?是低字节先发还是高字节先发?是bit0先发还是bit7先发?是从低地址开始读还是从高地址开始读?看完本篇比应该就明白了~ 内存的 ...
- 详解大端模式和小端模式【转】
详解大端模式和小端模式 一.大端模式和小端模式的起源 本文转载自:http://blog.csdn.net/ce123/article/details/6971544 关于大端小端名词的由来,有一个有 ...
- 【转】大端模式与小端模式、网络字节顺序与主机字节顺序 (经典)
大端模式与小端模式 一.概念及详解 在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式. 先回顾两个关键词,MSB和LSB: ...
- 计算机大端模式和小端模式 内存对齐问题(sizeof)
目录(?)[+] 一大端模式和小端模式的起源 二什么是大端和小端 三数组在大端小端情况下的存储 四为什么会有大小端模式之分呢 五如何判断机器的字节序 内存对齐问题 再讲讲pragma pack 内存对 ...
- 大端模式、小端模式、网络字节顺序与主机字节顺序
大端模式.小端模式.网络字节顺序与主机字节顺序 大端模式与小端模式 概念与详解 在各种体系的计算机中通常采用的字节存储机制主要有两种:big-endian和little-endian,即大端模式和小端 ...
- C/C++ 工具函数 —— 大端模式和小端模式的互换
小端模式:小在小,大在大:大端模式:小在大,大在小: uint32_t swap_endian(uint32_t val) {val = ((val << 8) & 0xFF00F ...
最新文章
- jsp cookie 中文乱码 的解决方法
- Java自动装箱与拆箱
- linux 查找文件_LINUX常用命令全集
- 线性代数的本质_01_向量、张成空间与基
- 华为移动应用引擎安装第三方apk教程
- 3dmax怎么清理注册表?3dmax注册表怎么删除干净?
- Kubernetes K8S之资源控制器Job和CronJob详解
- 图扑软件与华为云共同构建新型智慧工厂
- matlab生成高速轨道不平顺谱,国内外高速铁路轨道不平顺谱对比与思考.pdf
- Android通知Notification使用全解析,看这篇就够了
- 使用商用WiFi路由器有哪些优势?
- HTTP状态码302分析
- ChatGPT OpenAI 人工智能语言处理工具
- uniapp 运行模拟器 (MUMU)
- VM15安装之后没有出现VMnet1和VMnet8
- 时间序列学习(6):单整、协整、格兰杰检验
- 判断两条线段相交(跨立实验)
- 手持式基站综合分析仪
- 如何在CentOS中屏蔽恶意爆破IP (CentOS8.x)
- SAP HCM正向考勤取卡总结(方案篇)
热门文章
- 口袋西游无法连接服务器怎么修复,新服“聚仙阁”即将迎春开放
- 鲲鹏计算如何壮大计算湘军?岳麓峰会聚焦“长沙速度”
- 七雄争霸手机网页服务器,七雄争霸1月28日服务器数据互通公告
- windows定时服务
- 动态规划之零一背包问题
- 使用Keras来搭建VGG网络
- 力扣78 77 46 子集、排列、组合 C++ 回溯法
- python能做什么工作知乎-Python学到什么程度可以面试工作?
- 你知道几种Windows的热门办公软件呢,今天让我们一起看看吧
- 从数字化出海到出海数字化,中国数字经济打开全球化新格局