文章目录

  • 鲜为人知的大小端问题
    • 1. 大小端引起的问题
    • 2. 大小端模式理解
    • 3. 三种大小端转换方法

鲜为人知的大小端问题


1. 大小端引起的问题

  • 在进行通信数据拆包解析,不同单片机数据存储时,因为大小端问题,产生过几个问题BUG,问题简单描述如下代码:
// 数据包的4个byte表示一个数据,如下data[4]这4个byte表示数据0x1ec99
char data[4] = { 0x00, 0x01, 0xec, 0x99 };
int value = 0;
// 直接将data[4]数据地址复制到value地址上
memcpy(&value, data, 4);
// 得到的结果为 : 0x99ec0100
printf("value = 0x%x \r\n", value);
  • 问题分析如下:

(1) 对于数组来说:

地址 data[0] data[1] data[2] data[3]
0x00 0x01 0xec 0x99

(2) 将数组地址上数据 copy 到 value 地址上示意如下,但是从地址上取出数据时默认byte 4为高字节数,byte 1为低字节数,所以取出数据:0x99ec0100

地址 byte1 byte2 byte3 byte4
0x00 0x01 0xec 0x99

(3) 通过以上分析说明,假如值 0x12345678 ,实际存储方式应该如下:

地址 byte1 byte2 byte3 byte4
0x78 0x56 0x34 0x12

(4)通过以下代码验证上面问题,打印结果为 0x78 0x56 0x34 0x12

int sum = 0x12345678;
char* pt = (char*)∑
for (int i = 0; i < 4; i++) {printf("0x%x ",*(pt + i)); // 打印结果为:0x78 0x56 0x34 0x12
}

2. 大小端模式理解

  • 大端模式

    • 数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址
    • 地址由小向大增加,而数据从高位往低位放
    • 和我们的阅读习惯一致
  • 小端模式

    • 数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址
    • 高地址部分权值高,低地址部分权值低
  • 0x12345678 为例,两种字节序下其存储情况如下 :

大端存储方式:低地址存放高位,如下:

地址 byte1 byte2 byte3 byte4
0x12 0x34 0x56 0x78

小端存储方式:低地址存放低位,如下:

地址 byte1 byte2 byte3 byte4
0x78 0x56 0x34 0x12

3. 三种大小端转换方法

  • 介绍3种大小端转换方法,以大端类型 0x12345678 转换成小端类型 0x78563412 为例:
  • 方法1 : 位移运算和位操作
// 位移运算和位操作
int NetVal = 0x12345678;
int HostVal = 0;
HostVal = ((NetVal & 0x000000ff) << 24) | ((NetVal & 0x0000ff00) << 8) \| ((NetVal & 0xff000000) >> 24) | ((NetVal & 0x00ff0000) >> 8);
printf("NetVal = 0x%x , HostVal = 0x%x\r\n", NetVal, HostVal);
  • 方法2: 指针地址操作
// 指针地址操作
int NetVal = 0x12345678;
int HostVal = 0;
char* pVal = (char*)(&HostVal);
*pVal = (NetVal >> 24) & 0xff;
*(pVal + 1) = (NetVal >> 16) & 0xff;
*(pVal + 2) = (NetVal >> 8) & 0xff;
*(pVal + 3) = (NetVal >> 0) & 0xff;
printf("NetVal = 0x%x , HostVal = 0x%x\r\n", NetVal, HostVal);
  • 方法3 : 利用联合结构体
// 利用联合结构体
typedef union {int NetValue;char  data[4];
}NetToHost;  int NetVal = 0x12345678;
int HostVal = 0;
NetToHost value1;
NetToHost value2;
value1.NetValue = NetVal;
for (int i = 0; i < 4; i++) {value2.data[i] = value1.data[3 - i];
}
HostVal = value2.NetValue;
printf("NetVal = 0x%x , HostVal = 0x%x\r\n", NetVal, HostVal);

感谢阅读,如有错误,敬请见谅!!!


鲜为人知的大小端问题相关推荐

  1. 大小端存储模式的理解和判断

    在计算机系统中,存储是以字节为单位的,每个地址单元都对应着一个字节,一个字节=8bit.在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器). ...

  2. .pgr照片文件解析,C++与Java存储数据差别大小端模式

    一..pgr是什么? .pgr文件是二进制的图像文件,可以用普通的文本文件打开,或者查看十六进制的文本信息: 读取需要了解~~~非常重要 !!! 基本数据类型的大小端存储模式 表头Header 详细信 ...

  3. 联合体union和大小端(big-endian、little-endian)

    1.联合体union的基本特性--和struct的同与不同 union,中文名"联合体.共用体",在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(s ...

  4. Linux系统的大小端模式

    大端模式 所谓的大端模式,是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数 ...

  5. 大小端字节序介绍以及判断当前环境字节序的程序【C语言】

    文章目录 1.大小端字节序介绍 2. 判断当前环境的字节序程序 1.大小端字节序介绍 首先我们先来介绍什么是大端字节序,什么是小端字节序: 大小端字节序指的是数据在电脑上存储的字节顺序 小端字节序存储 ...

  6. 网络编程大小端的注意事项

    1.一个字节的数据无需注意大小端的问题 2. 首先判断主机平台的大小端的问题,才能决定是否使用网络字节序的转换

  7. C 语言编程 — 大小端区分

    目录 文章目录 目录 大端.小端 区分方式 1 区分方式 2 大端.小端 大端:高位字节放在内存的低地址端,低位字节放在内存的高地址端,CPU 对操作数的存放方式从高字节到低字节. 小端:低位字节放在 ...

  8. 计算机存储的大小端模式解析

    ---------------------------------------------------------------------------------------------------- ...

  9. 经典笔试题:用C写一个函数测试当前机器大小端模式

    "用C语言写一个函数测试当前机器的大小端模式"是一个经典的笔试题,如下使用两种方式进行解答: 1. 用union来测试机器的大小端 1 #include <stdio.h&g ...

最新文章

  1. python二级考试试题4答案_第4卷讲解Python语言计算机等级考试二级操作题
  2. 终于“打造”出了一个可以随时随地编程的工具
  3. java 视频 缩略图_Java截取视频文件缩略图
  4. python教程:文件读写
  5. JZOJ__Day 10:【普及模拟】【USACO】横幅
  6. Tampermonkey油猴插件各种浏览器下载教程【chrome、firefox、Edge、360、QQ、Safari等】
  7. 磁力计 姿态 matlab,磁力计如何用来计算姿态(1)
  8. 不懂高数,所以我用这本书入门深度学习 | 在线阅读+配套笔记
  9. 【深度学习】学习深度学习的最好方法
  10. Java 文件上传与下载
  11. 桥连模式,模板模式的改进
  12. 计算机导论课程思政,《计算机导论》课程教学中的思政教育.doc
  13. 软件开发中需求分析的过程、层次、阶段、重点都在这里
  14. 【Unity3D】导航系统
  15. 深度学习中的正则化的应用(最全)
  16. 计算机开机慢的原因及解决方法,电脑启动慢什么原因?如何解决
  17. 网盘上传文件服务器失败原因,win7系统在百度网盘上传文件一直失败的解决方法...
  18. 安装oh my zsh后出现的目录权限问题
  19. 添加遮罩css,添加遮罩层
  20. python导入mysqldb_Python导入MySQLdb库

热门文章

  1. 网关地址对于计算机的重要性
  2. rtx服务器消息管理器,RTX企业微信插件来了,现在你可以在手机上收发RTX消息
  3. 个人电脑常用工具汇总
  4. LintCode 买卖股票的最佳时机I II III IV
  5. 苏宁易购网址爬虫爬取商品信息及图片
  6. 信息安全的江湖 只有圈内人玩的转
  7. Python+Selenium爬虫--判断元素是否存在
  8. windows10开始键失效
  9. 贾斯特里尼布鲁克斯,葡萄酒中的天花板
  10. 经济管理类的顶刊和核心整理