大端与小端字节数据详解

转自:https://blog.csdn.net/dosthing/article/details/80641173

前言

计算机的数据以01构成的字节存储,这就涉及数据大小端的问题。计算机是大端数据模式还是小端数据模式对于普通的应用程序没有什么影响,但是在诸如网络编程、芯片寄存器操作的时候就有必要区分一下了,要不然会遇到程序的逻辑设计完全没问题,但得到的数据总是错误的尴尬。这里详细介绍一下这两种数据模式的差异,以及结合实际应用例子来检验我们主机的字节顺序模式。

字节顺序模式

计算机的字节顺序模式分为大端数据模式和小端数据模式,它们是根据数据在内存中的存储方式来区分的。小端字节顺序的数据存储模式是按内存增大的方向存储的,即低位在前高位在后;大端字节顺序的数据存储方向恰恰是相反的,即高位在前,低位在后。纯文字描述有点抽象。

我们结合一个例子来说明,如图一个16位的数据0xabcd在不同字节顺序的计算机内存中的存储情况。小端字节顺序中的数据存储是按照内存增长的方向存储的。

0xabcd中的0xcd属于低位数据,故存在Bit[0,7],11001101;

0xab属于高位数据,故存储在Bit[8,15],10101011;

组合起来就是两个字节16bit——》1010 1011 1100 1101 == 0xabcd;

大端字节顺序中的数据存储就反过来,高位数据0xab存储在低位Bit[0,7],低位数据0xcd存储在高位Bit[8,15]。小结:计算机的字节顺序模式就是数据在内存中存储方式的不同,小端数据模式与内存增长方向一致,大端数据模式与内存增长方向相反。

字节顺序应用

对字节顺序敏感的编程涉及的范围较多,这里以网络编程和芯片操作来说明大小端数据模式的转换问题。首先来说说网络编程,我们知道模式进网络上的数据都是以大端数据模式进行交互的,而我们的主机大多数是以小端数据行理,它们如果不处进行转换的话,势必会引起数据混乱。如图,我们主机的32位数据通过转换为网络字节序,转换的过程非常简单,将小端字节序的第3字节与网络字节序的第0字节对换、小端字节序的第2字节与网络字节序的第1字节对换、小端字节序的第1字节与网络字节序的第2字节对换、小端字节序的第0字节与网络字节序的第3字节对换。这个过程可以交由标准的POSIX库函数来完成,如htons()、htonl()分别将16位、32位主机数据转换为网络字节序;ntohs()、ntohl()则分别将16位、32位网络字节序转换为主机数据。

另一个应用是芯片操作,这一块在嵌入式系统中应用比较多,一般在芯片的说明手册中都会详细说明芯片通信时使用的数据格式,如果遇到与主机的字节顺序不一样的,我们必须进行转换。这里拿经典的AD转换芯片ADC0832来说明,ADC0832是一款将模拟信号转为数字信号的芯片,从它数据格式输出的时序图中也可以看出,它支持大端数据格式,也支持小端数据格式。假设ADC0832输出选用大端数据格式、主机是小端数据格式,当它们进行数据交互时,需要进行转换,比如主机想要发送一个16位的操作指令,我们可以通过移位、位与、位或等操作将数据进行字节顺序的转换。(下图截取之ADC0832芯片手册的ADC0832芯片数据操作时序图)

检测主机字节顺序样例

了解大小端字节顺序后,我们如何知道我们的主机是用什么字节顺序呢,这里提供一个样例,它兼容Window、linux等通用操作系统平台,编译运行即可。它的原理也很简单,利用共用体共用一段相同的内存,然后我们定义两个的变量(这里是short int与char),然后对长变量(short int 16位)进行初始化,接着按字节(char 8位)读取打印出来比较即可知道主机的字节顺序。

/*Describe: this program is used to check the host byteorder
**Author:shuang liang li
**Date:2018-06-10
*/
#include<stdio.h>//共用体类型的变量类型,用于测试字节序
//成员value的高低字节可以由成员type按字节访问
typedef union{unsigned short int value;//短整型变量unsigned char byte[2];  //字符型
}to;int main(int argc,char*argv)
{to typeorder;typeorder.value=0xabcd;if(typeorder.byte[0]==0xcd&&typeorder.byte[1]==0xab)//小端字节顺序{printf("\nlow endian byte order""byte[0]:0x%x,byte[1]:0x%x\n\n",typeorder.byte[0],typeorder.byte[1]);}if(typeorder.byte[0]==0xab&&typeorder.byte[1]==0xab)//大端字节顺序{printf("\nhight endian byte order""byte[0]:0x%x,byte[1]:0x%x\n\n",typeorder.byte[0],typeorder.byte[1]);}return 0;
}

总结

计算机的字节顺序模式有两种,大端数据模式和小端数据模式,在网络编程和芯片操作编程中应注意这两者的区别,以保证数据处理的正确性。

IoT:大端与小端字节数据详解相关推荐

  1. 大端与小端字节数据详解

    前言 计算机的数据以01构成的字节存储,这就涉及数据大小端的问题.计算机是大端数据模式还是小端数据模式对于普通的应用程序没有什么影响,但是在诸如网络编程.芯片寄存器操作的时候就有必要区分一下了,要不然 ...

  2. 小端模式和大端模式_计算机字节顺序(大端法和小端法)详解

    首先理清一下基本的概念: 1. 大多数机器使用时的8位的块(一个字节),作为可寻址的最小单位, 2. 机器级程序将内存视为非常大的字节数组(虚拟内存),内存的每个字节都由一个唯一的数字来表示(如下X的 ...

  3. 大端(Big Endian)与小端(Little Endian)详解

    大端(Big Endian)与小端(Little Endian)简介 /// 1. 你从哪里来? 端模式(Endian)的这个词出自JonathanSwift书写的<格列佛游记>.这本书根 ...

  4. 【原创】大端和小端字节序的细节

    这已经是一个被说得很烂的一个话题了,今天我想在这一篇文章补充一些细节上的东西,供备忘! 在看这篇文章之前,请先仔细看下链接这篇博文,关于字节序说得很详细!http://blog.chinaunix.n ...

  5. 2007-11-22 21:24 大端(Big Endian)与小端(Little Endian)详解

    [大端(Big Endian)与小端(Little Endian)简介] Byte Endian是指字节在内存中的组织,所以也称它为Byte Ordering,或Byte Order. 对于数据中跨越 ...

  6. 大端模式与小端模式的详解分析

    大端序与小端序 何为大端序,小端序? 简单点说,就是字节的存储顺序,如果数据都是单字节的,那怎么存储无所谓了,但是对于多字节数据,比如int,double等,就要考虑存储的顺序了.注意字节序是硬件层面 ...

  7. 大端小端存储模式详解及判断方法

    文章目录 大小端模式的概念 两种模式出现原因 两种模式的优劣 大小端的应用情景 判断机器的字节序 大小端模式的概念 当我们查看数据在内存中的存储情况时,我们经常会发现一个很奇怪的现象,什么现象呢? i ...

  8. 大端小端存储方式详解

    大端方式:用存储器的低字节地址单元来存放数据的最高字节 小端存放:用存储器的低字节地址单元来存放数据的最低字节 注: 在存储器中,左边的字节地址单元低于右边的字节地址单元,字节地址单元一般由八位二进制 ...

  9. 计算机网络——网络字节序(大端字节序(Big Endian)\小端字节序(Little Endian))

    网络字节序 网络字节序 1.网络字节序 (Network Byte Order)和本机转换 2.字节序转换函数 网络字节序 1.网络字节序 (Network Byte Order)和本机转换 1.大端 ...

最新文章

  1. css3 局部放大,CSS3/JS 鼠标悬停图片局部放大动效
  2. Maven 模块继承、聚合
  3. MSP430F149的ADC12应用
  4. android 自定义 popupwindow,Android自定义弹出窗口PopupWindow使用技巧
  5. ab plc编程软件_AB编程软件及所有组态软件授权及安装教程包含FTViewV11
  6. android微信h5转原生支付,微信原生支付流程以及踩坑
  7. springbootSecurity的使用
  8. 个税扣缴又出新规!12月31日前,所有人必须完成这件事,否则明年到手的工资要变少!...
  9. iOS开发RunLoop学习:三:Runloop相关类(source和Observer)
  10. Oracle学习方法
  11. 【大话设计模式】模式二 :工厂模式
  12. vue+ele 表格 根据表格字段名称显示前端图片文件夹对应图片 没有图片显示单独图片
  13. (特重要,请注意)毕业N年后,请不要被档案烦死
  14. 【Python】使用日历热图进行时序数据可视化
  15. java list逆序_Java使用ListIterator逆序ArrayList
  16. 【一文学会】vue.js入门到放弃
  17. 自制操作系统 1 准备工作
  18. 修改 ubnt 路由器固件
  19. 解读SpanBERT:《Improving Pre-training by Representing and Predicting Spans》
  20. swipei实现3D横向焦点图效果

热门文章

  1. Django + Uwsgi + Nginx 实现生产环境部署1
  2. Spring boot FastJson
  3. js中~~和^=分别代表什么,用处是什么?
  4. ajax同步导致ajax上面的代码不执行?
  5. 设计模式1:单例模式
  6. iOS $99 刀 开发者证书的申请步骤
  7. Win10开机跳过欢迎界面直接进系统桌面的设置方法
  8. 实战 | F1060路由模式典型组网配置案例(静态路由)
  9. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  10. sonar+Jenkins 构建代码质量自动化分析平台