应该说没做底层开发(硬件或驱动)的人很可能不会彻底理解大小端的概念,大小端不是简单的一句“大端在前”还是“小端在前”能够概括的问题。在cpu, 内存, 操作系统, 编译选项, 文件,网络传输中均有大小端的概念,这些东西加在一起,就很容易把人搞晕。我自己就晕过很久。

为方便说明,再做一些定义:

(1) 内存

可以存储若干个单元数据的物理设备,每个单元存储1个字节,每个单元有一个地址,其地址线程增长。为方便说明,假设内存地址从 0000:0000 一直增加到FFFF:FFFF。

用一个带箭头的直线表示地址的增长方向,例如

-------------------------->

表示左边的数据处于低地址,右边的数据处于高地址。

(2) U32整型

对于unsigned int的变量,计算机是以32bits存储的,即连续的4个字节。比如说,对一个值为0x11223344的整数,在内存中的排列方式可能为:

-------------------------->

11  22  33  44 (大端)

也可能为

44  33  22  11 (小端)

从CPU说起

在有了上述定义之后,开始讲大小端的起源。这得从CPU说起,我们知道CPU要从内存中加载程序数据来运行,CPU要对数字进行运算。那么,CPU在从内存加载4个字节的数据之后,要把它作为一个数字来运算。那它是怎么看待这个数字的呢?

-------------------------->

11  22  33  44

有的CPU认为它是0x11223344,有的CPU认为它是0x44332211。所以CPU就分为两类:Big-Endian和Little-Endian, 认为它是0x11223344的就是Big-Endian,认为它是0x44332211的就是Little-Endian。

有人会为,CPU的“认为”是什么意思。这其实物理上的电路问题,CPU的所有运算都是通过电路完成,其连接逻辑已经决定了它是按大端运算还是按小端运算。

程序

在知道了CPU的大小端之后,我们要写一个程序让CPU来运行,那么显然,程序必须遵从CPU的大小端。程序最终会load到内存里,所以其大小端的定义要和CPU一致。

具体得,程序都是有很多条指令构成的,每条指令4个字节。假设程序里有一个指令ADD,机器码为0xAABBCCDD。显然,只有内存里按顺序AABBCCDD出现时,CPU才能理解为是ADD。不然CPU根据不能辨识这条指令。

文件

程序是放在哪的呢?放在文件里的,文件也是线性的。所以可以这么认为,文件就是内存的一份映像,其数据内容是完全一样的(实际上不一样,但可以这么理解)。所以,如果cpu是大端,那么内存中的程序也必须是大端,保存程序的文件也必须是大端。

程序的编译

程序从哪来的?编译器编出来的。我们在用gcc来编译一个程序时,可能没有发现任何关于Endian的参数设置。这是因为有一个默认选项被指定义了。这可以参考gcc/ld相关的文档,关于link script的描述。在link script里是可以指定endian的。

  从上面可以看出,cpu、程序、编译过程这一套东西,其大小端都必须是一致的。这里就简称为系统的大小端。

网络传输

网络传输数据时需要考虑大小端。例如,想发送一个U32的数字给对方,需要连续发送4个字节。那么是才发送高字节,还是先发送低字节呢?一般来说,网络上一般是先传送高字节,即大端,又称为网络字节序。例如,在传递0x12345678的时候,会先传0x12, 再传0x34, 再0x56, 再0x78。

在代码判断大小端

inline bool IsLittleEndian()
{
    unsigned int a = 0x01;
    return (*((unsigned char*)&a) == 1);
}

系统无关的写法

在传送和保存数据时,可以写一份不管系统是大端还是小端、结果都相同的代码。这是用移位来实现的。比如,我们从网络上接收到4个字节,想把它转成一个U32。

U8 buf[4]; // 接收到4个字节, 按大端传递

U32 v = (buf[0] << 24) + (buf[1] << 16) + (buf[2] << 8) + buf[3];

一种错误的写法

在做编解码的时候会经常遇到关于大小端的问题,而写错的人大有人在,协议定义不好的也大有人在。一般来说,只要发现一个协议把数据定义成小端,那么我一般猜到了作者想干什么了。例如, 定义一个协议,发送以下数据,以小端发送。

U8  a

U8  b

U16  c

U32  d

那么程序基本上会这么写代码:

struct Msg

{

U8 a;

U8 b;

U16 c;

U32 d;

};

U8 buf[8];

Msg msg;

memcpy(&msg, buf, 8);

那intel的机器上,会发现这样刚好是对的。但是我要说这是不正确的写法。

BIT有大小端吗?

在软件编程领域,大小端总是按BYTE计算的,永远无需考虑BIT的大小端。因为数据的最小单元是BYTE,在物理环节中其顺序都固定好了,永远对的上。正因为如此,我们可以用位域来接收按位定义的信息,而不必担心大小端。如在PES的头部:

struct Flags

{

TS_UINT8 original_or_copy : 1;
  TS_UINT8 copyright : 1;
  TS_UINT8 alignment_indicator : 1;
  TS_UINT8 priority : 1;
  TS_UINT8 scrambling_control : 2;
  TS_UINT8 not_used : 2;

}

但要注意的是,这仅限于字节之内的情形。

转载链接:http://blog.csdn.net/xiaojun111111/article/details/42294223
其他相关链接: 

ENDIAN的由来及BIG-EDIAN 和LITTLE-ENDIAN

一、引子   在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了 计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、 字、双字等等)应该以什么样的顺序进行

字节顺序:高位优先(big-endian)和低位优先(little-endian)

字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节序是高字节数据存放在低地址处

转载于:https://www.cnblogs.com/1175429393wljblog/p/8175931.html

大小端 Big-Endian 与 Little-Endian相关推荐

  1. java大小端模式_深入浅出: 大小端模式

    Writer      :BYSocket(泥沙砖瓦浆木匠) 一.什么大小端? 大小端在计算机业界,Endian表示数据在存储器中的存放顺序.百度百科如下叙述之: 大端模式,是指数据的高字节保存在内存 ...

  2. netty 大端小端_深入浅出: 大小端模式

    Writer      :李强强 一.什么是大小端? 大小端在计算机业界,Endian表示数据在存储器中的存放顺序.百度百科如下叙述之: 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节 ...

  3. bit feild and CPU endian 位域和大小端

    先看一个示例: // C code: bit fields & CPU endian #include <stdio.h>struct bit_field{unsigned sho ...

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

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

  5. 整型,长整型,无符号整型等 大端和小端(Big endian and Little endian)

    一.大端和小端的问题 对于整型.长整型.无符号整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节):而 Little endian ...

  6. byte endian(biglittle endian)

    1. 大小端的区别 little endian:把低位字节存放在内存的低位; // big endian:   将低位字节存放在内存的高位; 比如:0x1234,则12 就属于高位字节:34 属于低位 ...

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

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

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

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

  9. 程序员面试系列——大小端

    大小端是哪里来的概念 大端.小端是"字节顺序"里面的概念.字节顺序可以分为大端序.小端序.混合序. 什么是字节顺序 "字节顺序"简称为"字节序&quo ...

  10. 大小端模式,stm32采用小端模式

    存储模式: 小端:较高的有效字节存储在较高的存储器地址,较低的有效字节存储在较低的存储器地址. 大端:较高的有效字节存储在较低的存储器地址,较低的有效字节存储在较高的存储器地址. STM32 属于小端 ...

最新文章

  1. Ubuntu 17 安装 tensorflow
  2. matlab optimvar
  3. hdu 5045 Contest(状态压缩DP)
  4. 系统架构:Web应用架构的新趋势 前后端分离的想法
  5. sqoop建表_Sqoop学习之路 (一)
  6. Mycat安全_SQL拦截白名单---MyCat分布式数据库集群架构工作笔记0033
  7. 由一个DAOHelper类引发的思考
  8. 《System语言详解》——4. 探
  9. sqlserver CASE WHEN语句示例
  10. 华为设备OSPF配置命令
  11. Blumind 思维图软件
  12. java流程图平行四边形_编程技巧之流程图
  13. 针对永恒之蓝Wannacry勒索病毒微软Windows操作系统 MS17-010 漏洞补丁资源共享
  14. ISweek工采网·工采电子参展OFweek维科网 2021全球数字经济产业大会圆满落幕
  15. 极简短网址链接生成系统网站源码
  16. CCF-卖菜(Python)
  17. 异贝,移动互联网技术,为中小微实体企业联盟、线上链接、线上线下自定义营销方案推送。案例42
  18. 无人机编程donekit及通讯(一)
  19. 【Oracle】基础语句
  20. ThreadPoolExecutor中addWorker,continue retry和break retry是什么意思

热门文章

  1. 表现SOTA!DetCo算法:目标检测无监督对比学习
  2. 超赞!arXiv论文如何一键链接解读视频,这个浏览器扩展帮你实现
  3. 太赞了!避免掉坑!佐治亚理工21页优雅读博指南
  4. 收藏 | 机器学习特征选择方法总结
  5. 【干货】卷积神经网络Alex-Net、VGG-Nets、Network-In-Network案例分析
  6. HALCON学习之旅(七)
  7. 数据分析中的可视化-常见图形
  8. java web access_Java Web项目中连接Access数据库的配置方法
  9. ESXI忘记密码怎么办
  10. css设置元素继承父元素宽度_详解CSS中的百分比的应用