前言

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

字节顺序模式

计算机的字节顺序模式分为大端数据模式和小端数据模式,它们是根据数据在内存中的存储方式来区分的。小端字节顺序的数据存储模式是按内存增大的方向存储的,即低位在前高位在后;大端字节顺序的数据存储方向恰恰是相反的,即高位在前,低位在后。纯文字描述有点抽象,我们结合一个例子来说明,如图一个16位的数据0xabcd在不同字节顺序的计算机内存中的存储情况。小端字节顺序中的数据存储是按照内存增长的方向存储的,0xabcd中的0xcd属于低位数据,故存在Bit[0,7],0xab属于高位数据,故存储在Bit[8,15];大端字节顺序中的数据存储就反过来,高位数据0xab存储在低位Bit[0,7],低位数据0xcdb存储在高位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;
}

总结

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

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

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

    大端与小端字节数据详解 转自:https://blog.csdn.net/dosthing/article/details/80641173 前言 计算机的数据以01构成的字节存储,这就涉及数据大小端 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. PLSQL的 dynamic sql小例子
  2. 13.2System类中的常用方法
  3. python爬虫实战测评_Python 爬虫实战入门(上)
  4. Qt QString 中文 char* UTF-8 QByteArray QTextCodec unicode gb2312 GBK 乱码与转码问题
  5. 浏览器自定义css代码,根据浏览器不同设置CSS
  6. EE Servlet 3:在Servlet中生成HTML输出
  7. quartz java 线程 不释放_java Quartz 内存泄漏
  8. 报错:OMP: Error #15: Initializing libomp.dylib, but found libiomp5.dylib already initialized.
  9. linux下彻底卸载mysql 图解教程
  10. SVN版本控制—branches、trunk、tag篇
  11. 批量梯度下降和随机梯度下降法的缺点
  12. nvenc vs x264 对比(1)
  13. adb命令查看手机设备
  14. 在Unity中使用FFmpeg将视频绿色背景处理为透明背景
  15. 2021年适合做什么行业?有发展前景的行业
  16. android bugly 符号表,Bugly的符号表工具使用总结-iOS
  17. 牛宝宝取名起名字:寓意前程似锦、仪表不凡的男孩名字
  18. 向日葵远控软件无法复制粘贴问题 解决方法
  19. 自己作为CA签署SSL证书
  20. 当成为全球第二大汽车出口国后,中国车企的下一步是什么?

热门文章

  1. 在matlab中生成m序列
  2. matlab中种子填充算法
  3. 配置samba服务器全过程
  4. RabbitMQ的消费者处理消息失败后之重试3次,重试3次仍然失败发送到死信队列。
  5. Kafka生产者是如何发送消息的?
  6. TBB简介和一个简单的示例
  7. mysqladmin 管理命令详细应用
  8. GlobalMapper20转换KML为GeoJson,保留名称
  9. go-kit微服务,服务注册与发现,负载均衡(二)
  10. JDK1.8之前造成HashMap死链问题