Little endian & Big endian是何意思?

ARM的大端格式big endian、小端格式little endian和字word 在ARM体系结构的数据存储格式中,将4字节定义为一个字(Word),2字节定义为半字。 例如从0地址开始存放字数据,0号字节到3号字节放置第一个字数据,从第4号字节到第7字节放置第二个字数据。 当ARM处理器向以字节为单位编址的线性地址空间写入字数据(或半字数据)时,就存在一个字(或半字)中,高位字节和低位字节与存储器连续的4个字节单元(或2个)字节对应的问题。 小端格式是字数据中的低字节对应4个字节存储空间的低地址单元、高字节对应存储空间的高地址单元。 大端格式是字数据中的低字节对应4个字节存储空间的低地 阅读详情

Little endian & Big endian是何意思?

low byte high byte 
0x12       0x34

这是内存中一个WORD值中的内容,那么这个WORD中的值是0x1234呢,还是0x3412 ? 

Endian是什么意思呢?还是让我们先来看看下面的情况,这是内存中一个WORD值中的内容,那么这个WORD中的值是0x1234呢,还是0x3412 ? 

low byte high byte 
0x12       0x34 

熟悉x86汇编的人立刻就知道这个值应为0x3412,很对,但在一些情况下,比如说你在SGI的机器上看到这种情况,则正好相反,0x1234才是正确答案,这与CPU内部处理数据的方式有关。这两种处理方式都存在于不同厂商生产的CPU之中,在上例中若此WORD值为0x3412的,我们称之为 little-endian, 若为0x1234的,我们称之为big-endian,这是两种不同的byte orders。MSDN中有比较精确的定义如下:

Byte Ordering Byte ordering Meaning 
big-endian The most significant byte is on the left end of a word. 
little-endian The most significant byte is on the right end of a word. 

一般来说我们不用关心byte ordering的问题,但若要涉及跨平台之间的通信和资源共享,则不得不考虑这个问题了。也许你会说,我永远不会去用其它非x86的CPU,也许是这样,你甚至可以不必知道我们最常用的Intel,AMD等生产的x86的byte ordering是little- endian的,而且按现在的装机数量来看,可以说世界上绝大多数CPU是little-endian的,但多了解一些没有什么坏处,也许有用上的一天,实际若您要涉及到网络编程,了解一些还是有所帮助的,看完本文后您就应该知道为何socket编程中为何要用到如 ntohl, htonl,  ntohs, htons这几个看起来名字似乎怪怪的API了,也很容易理解这些函数名的意义了。

假设我们要在不同byte ordering的机器之间传输和交换数据,那该怎么办呢,有两个方法,一是全部转换成文本来传输(如XML使用的),另一个方法两方都按照某一方的byte order,这时就涉及到了不同byte order之间相互转换的问题(网络传输标准如TCP/IP采用第二种方法并且由于历史的原因,byte ordering是 big-endian的)。两种之间该如何转换呢?方法有很多,我们可以先看看MFC中在处理serialize的代码中所用的方法(List), 虽然代码应该是高效易读的, 但我个人并不喜欢它, 原因是我觉得这不是一种通用优美的方法.下面列出的是我自己写的转换的代码:


template  F3D_INLINE T ConvertEndian(T  t)
{
       T tResult = 0; 
       for (int  I = 0; I < sizeof(T); ++ I) 
       { 
              tResult <<= 8; 
              tResult |= (t & 0xFF) ; 

              t >>= 8; 
       } 
       return  tResult;
}

原理非常简单,交换字节顺序,我就不多说了,当然这个写法并不是快速的, 只是通用的(我没条件试, 若有不对之处请指出), 若要快速的代码,可以在不同 platform上用与platform相关的代码, 如在PowerPC上有 "load word byte-reversed indexed"  (lwbrx) 和 "load halfword byte-reversed indexed" (lhbrx) 指令, 在x86上还可用 BSWAP单个汇编指令等,在类型上专为int16, int32写的通用的代码也可以比这快得多. 

当然如果在byte ordering相同的情况下,应该不必用这个转换函数,所以我们可以定义一个宏来处理不同的byte  ordering,也可以在运行时测试byte ordering, 下面的代码给出了一个简单的测试方法。 


// Test for endianness.
F3D_INLINE bool IsLittleEndian(void)
{
      DWORD dwTestValue = 0x12345678L;
      return  (*((BYTE*)&dwTestValue) == 0x78);
}

但是float比较怪,有可能所涉及到不仅仅是byte order的问题,因为有些平台如Alpha不使用IEEE的浮点格式,还得自己转换。当然同上,其它的方法一是将所用的float用文本方式输入输出,另一个办法是在某些情况下可将其转换成定点数再处理,这里我不再深入。

如果是读写第三方已经指定byte order的文件或数据流,比如说读SGI的位图文件格式,则可以直接自行按指定的byte order拼起来,不必考虑host机是何种byte ordering。下面我给出相应的代码:


// Read a little-endian TYPE from address
template F3D_INLINE T GetLittleEndian(const BYTE*  pBuf)
{ 
       T tResult = 0; 
       pBuf += sizeof(T) - 1; 
       for (int  I = 0; I < sizeof(T); ++ I) 
       { 
              tResult <<= 8; 
              tResult |= *pBuf --; 
       } 
       return  tResult;
}

// Read a big-endian TYPE from address
template F3D_INLINE T GetBigEndian(const BYTE*  pBuf)
{ 
       T tResult = 0; 
       for (int  I = 0; I < sizeof(T); ++ I) 
       { 
              tResult <<= 8; 
              tResult |= *pBuf ++; 
       } 
       return  tResult;
}

// Set a little-endian TYPE on a address
template F3D_INLINE void SetLittleEndian(BYTE*  pBuf, T  t)
{ 
       for (int  I = 0; I < sizeof(T); ++ I) 
       { 
              *pBuf ++ = BYTE(t & 0xFF); 
              t >>= 8; 
       }
}

// Set a big-endian T on a address
template F3D_INLINE void SetBigEndian(BYTE*  pBuf, T  t)
{ 
       pBuf += sizeof(T) - 1; 
       for (int  I = 0; I < sizeof(T); ++ I) 
       { 
              *pBuf -- = BYTE(t & 0xFF); 
              t >>= 8; 
       }
}

从上文可以看出,byte order挺简单的,一般应用中可能也用不上,但若您对写跨平台的程序有兴趣,则一定要了解的比较清楚才行。以上代码都是从实际使用的源码中取下来的。 

附:常见Processor, OS的byte ordering情况

Processor OS Order 
x86 (Intel, AMD, ... ) All little-endian 
DEC Alpha All little-endian 
HP-PA NT little-endian 
HP-PA UNIX big-endian 
SUN SPARC All? big-endian 
MIPS NT little-endian 
MIPS UNIX big-endian 
PowerPC NT little-endian 
PowerPC non-NT big-endian 
RS/6000 UNIX big-endian 
Motorola m68k All big-endian
 

CPU中的Little Endian与Big Endian CPU中的Little Endian与Big Endian今天在学习利用buildroot编译软件包的时候,make menuconfig之后在Target Architecture选项中发现了同一种CPU架构中有两个不同的选项,分别是little endian和big endian,如下图: 在好奇心的驱使下我就必应了一下,原来是不同CPU存储字节的顺序不同。Little Endian与Bi 阅读详情

相关推荐

Big-Endian 和 Little-Endian 字节排序

  Big-Endian 和 Little-Endian 字节排序字节排序含义Big-Endian一个Word中的高位的Byte放在内存中这个Word区域的低地址处。Little-Endian一个Word中的低位的Byte放在内存中这个Word区域的低地址处。必须注意的是:表中一个Word的长度是16位,一个Byte的长度是8位。如果一个数超

bisword的专栏 2235

Little Endian, Big Endian, 网络字节序

字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。 Little Endian还是Big Endian与操作系统和芯片类型都有关系。 Motorola的PowerPC系列CPU和Intel的x86系列CPU; PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。 (1)Little endian:

cai0612123的专栏 1961

URL编解码、Big Endian和Little Endian

Big Endian和Little Endian

zhaohong_bo的专栏 533

Little endian & Big endian

这个标题中的Endian是什么意思呢?还是让我们先来看看下面的情况,这是内存中一个WORD值中的内容,那么这个WORD中的值是0x1234呢,还是0x3412 ?  low byte high byte  0x12 0x34  熟悉x86汇编的人立刻就知道这个值应为0x3412,很对,但在一些情况下,比如说你在SGI的机器上看到这种情况,则正好相反,0x1234才是正确答案,这与CPU内部处理数据

FreeXploiT 1571

判断CPU是Big-Endian还是Little-Endian

最近看到了一个题目写一个函数去判断cpu是Big-Endian还是Little-Endian.这个题目说其实很简单,只要你对Big-Endian和Little-Endian足够了解。解法也比较多。不过由于平时编程估计大家不大会遇到这样的问题。所以可能还是有人一时间想不出来的。下面给出我网上找到的几个小函数,并附上一些说明。 首先复习下什么是Big-Endian和Little-Endian

u012263626的专栏 1789

Big-Endian和Little-Endian的判断,以及我写的C语言测试程序

1,什么是字节顺序 指的就是数据在内存里存储的顺序,通常我们默认一个存储单元为1Byte,一个逻辑数据比如Float是4个Byte,它在内存理存储的顺序可以是高字节在前,也可以是低字节在前.这样就有区分了. 2,有些什么顺序: Big-Endian(MSB),高字节在低地址  中文称“大端” Little-Endian(LSB),低字节在低地址 中文称“小端” 3,为什么要有字节顺序? 因为程序

小桥加加的IT博客 2203

字节序:Big Endian 和 Little Endian

字节序 字节序,也就是字节的顺序,指的是多字节的数据在内存中的存放顺序。 在几乎所有的机器上,多字节对象都被存储为连续的字节序列。例如:如果C/C++中的一个int型变量 a 的起始地址是&amp;a = 0x100,那么 a 的四个字节将被存储在存储器的0x100, 0x101, 0x102, 0x103位置。 根据整数 a 在连续的 4 byte 内存中的存储顺序,字节序被分为大端序(Big Endian) 与 小端序(Little Endian)两类。 然后就牵涉出两大CPU派系: Motorola

OceanStar的博客 9009

从解压到编译:手把手带你用TeXstudio搞定第一篇ACM LaTeX论文

本文详细指导如何使用TeXstudio从解压ACM LaTeX模板到成功编译第一篇学术论文的全过程。涵盖环境准备、模板配置、TeXstudio设置及常见问题排查,特别针对ACM会议论文格式要求,帮助学术新人快速掌握LaTeX写作技巧。

weixin_30655569的博客 254

浮点数通信

浮点数通信

weixin_58619062的博客 1038

SAP IDOC实战:如何用EDI实现跨公司采购订单自动生成销售订单(附完整配置步骤)

本文详细解析了如何利用SAP IDOC与EDI技术,实现跨公司采购订单自动生成销售订单的完整流程。通过实战案例,从业务蓝图设计、输出条件配置、伙伴参数设定到IDOC消息类型处理,提供了清晰的配置步骤与故障排查指南,帮助企业打通内部业务流,构建高效的自动化闭环。

weixin_29215815的博客 728

5分钟搞懂知识抽取:如何把非结构化数据变成知识图谱的宝藏?

本文通过一个电商评论分析实战案例,详细解析了如何利用spaCy、Neo4j等工具,将非结构化文本数据转化为结构化知识图谱的完整流程。文章重点阐述了知识抽取的核心步骤,包括命名实体识别、关系抽取以及知识存储与查询,帮助读者快速掌握将数据转化为知识宝藏的关键技术。

weixin_29054245的博客 235

ARM中,Little endian & Big endian是何意思?

这个标题中的Endian是什么意思呢?还是让我们先来看看下面的情况,这是内存中一个WORD值中的内容,那么这个WORD中的值是0x1234呢,还是0x3412 ?  low byte high byte  0x12 0x34  熟悉x86汇编的人立刻就知道这个值应为0x3412,很对,但在一些情况下,比如说你在SGI的机器上看到这种情况,则正好相反,0x1234才是正确答案,这与CPU内部处理数据

流水寿司的专栏 2725

当GO.db安装失败时,生物信息学新手应该知道的5个底层逻辑

本文为生物信息学新手提供了解决GO.db安装失败的5个关键底层逻辑,包括网络连接与镜像源设置、版本兼容性检查、依赖关系管理、SQLite存储机制理解以及调试技巧。特别针对Bioconductor的GO.db包安装问题,详细介绍了如何通过切换国内镜像、管理版本冲突和解决依赖问题来成功安装,帮助用户高效克服常见安装障碍。

weixin_29062823的博客 407

Big Endian 和 Little Endian 详解

一、Endian的起源 在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正确的编/译码从而导致通信失败。 1980年,Danny Cohen在其著名的论文”On Holy Wars and a Plea for Peace...

心中的执念的博客 9万+

大红球预警版-精选+自定义板块监控

这是一款简单易用的股票大单资金监控插件,兼容通达信软件,可嵌入分时图或定制版面。它以红绿圆球直观显示主力买卖情况(红球为买,绿球为卖),支持300万以上大单语音播报。插件提供实时资金流向分析、多股同时监控、自定义预警条件等功能,无需L2账号。用户可自由切换图形/列表模式,监控特定板块,并配合幻影软件实现自动交易。虽然上涨股通常红球占优,但需结合其他指标综合判断。该插件完全免费,包含详细视频教程,适合新手使用。

guleba的博客 1794

(十五)CX20106A 中超声波测量的应用

(十五)CX20106A 中超声波测量的应用

m0_52555663的博客 4513

大小端字节序(Big Endian和Little Endian)

那么何为字节序(Endia)呢? Big Endian是指低地址存放最高有效字节(MSB),而Little Endian则是低地址存放最低有效字节(LSB)。 大端模式 所谓的大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放; 例子: 0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000 0000440: b

熊浪的博客 6958

车载以太网网络测试-24【SOME/IP概述】

SOME/IP**(Scalable Service-Oriented Middleware over IP)是一种基于IP网络的面向服务的通信协议,专为汽车电子系统设计,支持服务发现、远程过程调用(RPC)和事件通知等功能。核心标准是由 AUTOSAR(汽车开放系统架构)定义,现已成为车载通信的重要标准之一(如AUTOSAR 4.0+)。SOME/IP的全称是,它是一种基于IP网络的面向服务的通信协议,广泛应用于汽车电子(AUTOSAR)和物联网领域。Scalable(可扩展的)含义。

车载网络测试工程师的博客 2192

什么是Little Endian和Big Endian?(Endianness:字节序、端序、尾序)

当数据在网络传输或磁盘存储时,都是以字节为单位,而每字节占8bit;那多字节数据如int,以什么顺序读写字节、如何组装成最终输出的数据呢?

reading-conference-writing 8612

42、Windows Server Update Services(WSUS)全面指南

本文全面介绍了Windows Server Update Services(WSUS)的安装、配置、管理与优化策略。内容涵盖WSUS基础认知、客户端更新问题解决、多服务器架构设计、计算机分组策略、更新审批与报告查看,并深入探讨了SSL加密配置、性能优化、与其他系统(如AD和SCCM)集成以及常见故障排查方法。通过本指南,IT管理员可高效部署和管理企业级软件更新,提升安全性和运维效率。

cicd6pipeline的博客 99

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Big Endian 和 Little Endian 模式的区别

谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是little endian呢? 其实big endian是指低地址存放最高有效字节(MSB),而little ...

程序猿老樊的博客 5713

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

big-endian和little-endian

 big-endian和little-endian这两个术语来自Jonathan Swift在十八世纪的嘲讽作品Gulliver’s Travels(《格列佛游记》。)。 Blefuscu帝国的国民被根据吃鸡蛋的方式划分为两个部分:一部分在吃鸡蛋的时候从鸡蛋的大端(big end)开始,而另一部分则从鸡蛋的小端(little end)开始。由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢

yingpansjhf的专栏 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

CPU存储方式—Big Endian、Little Endian

嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解,采用Little-endian模式的CPU对操作数的存放方式是低字节到高字节,而Big-endian模式CPU对操作数的存放方式是从高字节到低字节。 一、为什么会有Little-Endian和Big-Endian之分?   这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8

jpbj_zb的博客 2359

[Linux]Linux中的big endian和little endian

1、由来 Big-endian和Little-endian是用来表述一组有序的字节数存放在计算机内存中时的顺序的术语。Big-endian(即“大端结束”或者“大尾”)是将高位字节(序列中最重要的值)先存放在低地址处的顺序,而Little-endian(即“小端结束”或者“小尾”)是将低位字节(序列中最不重要的值)先存放在低地址处的顺序。举例来说,在使用Big-endian顺序的计算机中,要存储

砚的专栏 4008

关于Big Endian和Little Endian

由来:big-endian和little-endian这两个术语来自Jonathan Swift在十八世纪的嘲讽作品Gulliver’s Travels。 Blefuscu帝国的国民被根据吃鸡蛋的方式划分为两个部分:一部分在吃鸡蛋的时候从鸡蛋的大端(big end)开始,而另一部分则从鸡蛋的小端(little end)开始。x86的CPU使用的是LE(Windows中称为“主机字节序”),

afxid的专栏 2121

big endian little endian 说明

用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存储顺序如下所示:Big Endian   低地址                                            高地址   ----------------------------------------->   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

sunshuai03的专栏 1656
上一篇: 代码设计的探索zz
下一篇: linux中echo的用法
spry97
博客等级 码龄23年 2粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值