基础笔记3 —— 关于大小端数据存储方式的转换及测试说明
发布日期:2021-07-01 04:04:04
浏览次数:3
分类:技术文章
本文共 1745 字,大约阅读时间需要 5 分钟。
文章目录
说明
为什么会关心大小端问题 ?
在控制系统中,由于CPU架构以及编译器等因素决定了数据的存储方式,不同的存储方式,其数据的发送/解读方式需要使用响应的方法。
因此,在数据传输时,我们有必要弄清楚两台或多台设备的存储方式是大端还是小端。尤其是在两台存储方式不同的设备之间实现通信,必须要搞明白这件事情,否则可能会导致数据解读不正确的问题。
大小端的起源不在进行赘述,请参考维基百科等文献。
1.大小端概念
-
大端(Big-Endian): 低地址存放高位
-
小端(Little-Endian): 低地址存放低位
举个栗子,对于0x12345678这个数,存放在地址0x4000中,大小端的存储方式区别如下表:
内存地址 | 小端模式存放内容 | 大端模式存放内容 |
---|---|---|
0x4000 | 0x78 | 0x12 |
0x4001 | 0x56 | 0x34 |
0x4002 | 0x34 | 0x56 |
0x4003 | 0x12 | 0x78 |
再来个更直观的叙述方式:
对于大端模式:
- 低地址---------->高地址 0X12|0X34|0X56|0X78|
对于小端模式:
- 低地址---------->高地址 0X78|0X56|0X34|0X12|
2.各自的优势
-
大端存储:顺序存储,符合人的思维,符号位的判定固定为第一个字节,容易判断正负;
-
小端存储:强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。
3.现阶段大小端模式的使用情况
- 目前Intel的80x86系列芯片是唯一还在坚持使用小端的芯片;
- ARM芯片默认采用小端,但可以切换为大端;
- MIPS等芯片要么采用全部大端的方式储存,要么提供选项支持大端——可以在大小端之间切换;
另外,对于大小端的处理也和编译器的实现有关:
- 在C语言中,默认是小端(但在一些对于单片机的实现中却是基于大端,比如Keil 51C);
- Java是平台无关的,默认是大端。
此外,
- 在网络上传输数据普遍采用的都是大端。
4.测试所用设备的数据存储方式
对于这个问题,百度百科也给出了一些测试程序。
测试方法由多种:
4.1 使用union测试机器大小端
#includeint check_sys(){ union UN { char c; int i; }un; un.i = 1; if (un.c == 1) { return 0; } else { return 1; }}int main(){ int ret = check_sys(); if (ret == 1) { printf("Is big endian\n"); } else { printf("Is little endian\n"); } return 0;}
4.2 使用指针测试
#includeint check_sys(){ int i = 1; int *p = &i; char *q = (char *)p; if (*q == 1) { return 0; } else { return 1; }}int main(){ int ret = check_sys(); if (ret == 1) { printf("Is big endian\n"); } else { printf("Is little endian\n"); } return 0;}
5.大小端的转换
思路1:直接交换字节
思路2:先与再移位,得到各地址的数据,最后按相应的顺序排列(( a&0x000000ff)<< 24 ) | ( ( a&0x0000ff00 ) << 8 ) | ( ( a&0x00ff0000 ) >> 8 ) | ( ( a&0xff000000 ) >> 24 )
具体代码参见其他博文。
https://baike.baidu.com/item/%E5%A4%A7%E5%B0%8F%E7%AB%AF%E6%A8%A1%E5%BC%8F/6750542?fr=aladdin
转载地址:https://miracle.blog.csdn.net/article/details/92806340 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月12日 13时33分43秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
flask整理之 flask程序中的debug模式
2019-05-01
比特币,父母这一辈能接受吗?
2019-05-01
为什么要反对比特币,这不代表是空气币
2019-05-01
SnapEx的新感觉,对新手很友好
2019-05-01
首个聚合器怎么产生的,并运用领域在什么
2019-05-01
区块链技术应用,最先医疗行业
2019-05-01
新币上市旧币会降价吗
2019-05-01
当博士进入币圈会怎么样
2019-05-01
PHP之 使用PHPMailer插件实现邮件发送功能
2019-05-01
《增长黑客》(肖恩·艾利斯)学习笔记——第二部分 实战
2019-05-01
python使用HTMLTestRunner查看运行函数
2019-05-01
python的ImportError
2019-05-01
linux下安装jenkins+git+python
2019-05-01
解决uiautomatorviewer中添加xpath的方法
2019-05-01
性能测试的必要性评估以及评估方法
2019-05-01
Spark学习——利用Mleap部署spark pipeline模型
2019-05-01
Oracle创建表,修改表(添加列、修改列、删除列、修改表的名称以及修改列名)
2019-05-01
使用redis实现订阅功能
2019-05-01
对称加密整个过程
2019-05-01