`
ynztpwl
  • 浏览: 59486 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Big Endian和Little Endian的区别

 
阅读更多

1.故事的起源

“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。

我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。

2.什么是Big Endian和Little Endian?

在设计计算机系统的时候,有两种处理内存中数据的方法。一种叫为little-endian,存放在内存中最低位的数值是来自数据的最右边部分(也就是数据的最低位部分)。

比如某些文件需要在不同平台处理,或者通过Socket通信。这方面我们可以借助ntohl(), ntohs(), htonl(), and htons()函数进行格式转换,
个人补充:一个操作数作htonl或ntohl结果不一定相同,当机器字节序跟网络字节序刚好是仅仅big endian和little endian的区别时是相同的。

3. 如何理解Big Endian和Little Endian

举个例子:
int a = 1;
a这个数本身的16进制表示是0x00 00 00 01
在内存中怎么存储呢?
如果你的CPU是intel x86架构的(基本上就是通常我们说的奔腾cpu),那么就是<wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x01</wbr><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">, 这也就是所谓的little-endian, 低字节存放在内存的低位.<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> 如果你的CPU是老式AMD系列的(很老很老的那种,因为最新的AMD系列已经是x86架构了), 它的字节序就是big-endian, 其内存存储就是<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x01</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">在内存中从高字节开始存放。<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> 现在世界上绝大多数的CPU都是little-endian。<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> 4. 了解big-endian和little-endian有什么作用?<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> 一个重要的作用就是了解在网络上不同的机器间的数据如何传输。<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> 假设我们在网络上有两台机器A和B, 其中A为little-endian,B为big-endian<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> 机器A要传输上面的整数a给机器B,如何传输呢?<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> 过程是这样的:<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> 机器A先把a在内存中的四个字节<u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x 01</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">转化为网络字节序<u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x01</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">,然后一个字节一个字节(从0x00到0x01)喂到网络上去<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> 然后机器B从网络上一个字节一个字节地取出四个字节<u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x01</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">后又会转化为本地字节序<u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x01</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">后放入内存。因而B正确地得到了来自A的数据a<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> 如果数据缺少在网络上的字节序转换的话,情况会怎样呢?<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> 机器A先把a由在内存的四个字节<u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x 01</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">一个字节一个字节地喂到网络上,然后机器B从网络上一个字节一个字节地收到<u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x 01</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><u style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">0x00</wbr></u><wbr style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">并放入到内存中, B认为他收到了0x01000000, 也就是十进制数1677216,这显然是错误的.<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> 5.如何判断系统是Big Endian还是Little Endian?<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"> 在/usr/include/中(包括子目录)查找字符串BYTE_ORDER(或_BYTE_ORDER, __BYTE_ORDER),确定其值。这个值一般在endian.h或machine/endian.h文件中可以找到,有时在feature.h中,不同的操作系统可能有所不同。一般来说,Little Endian系统BYTE_ORDER(或_BYTE_ORDER,__BYTE_ORDER)为1234,Big Endian系统为4321。大部分用户的操作系统(如windows, FreeBsd,Linux)是Little Endian的。少部分,如MAC OS ,是Big Endian 的。本质上说,Little Endian还是Big Endian与操作系统和芯片类型都有关系。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

分享到:
评论

相关推荐

    nohead big endian to little endian

    nohead data big endian to little endian

    Big Endian & Little Endian.pdf

    **Big Endian** 和 **Little Endian** 是指多字节数据(如整数或浮点数)在内存中存储时,字节间的排列顺序。这两种方式的区别主要在于最高有效字节(Most Significant Byte, MSB)和最低有效字节(Least ...

    little endian和big endian的概念解释

    ### Little Endian 和 Big Endian 的概念解释 #### 一、基本定义 在计算机科学领域,数据存储的方式对于数据处理的效率以及程序的兼容性至关重要。其中,Little Endian 和 Big Endian 是两种常见的字节顺序(Byte ...

    大端(Big Endian)与小端(Little Endian)简介

    这些字节如何在内存中排列,涉及到两种主要的存储方式——大端(Big Endian)与小端(Little Endian)。本文将深入探讨这两种存储方式的概念、原理及其应用场景。 #### 二、大端与小端的定义 1. **大端表示法(Big...

    Little_Big_endian.rar_big endian_little

    这里我们主要讨论两种字节顺序:大端字节序(Big-endian)和小端字节序(Little-endian)。这两个术语源自Gulliver's Travels中的两个部落名称,用来形象地描述数据在内存中的排列方式。 标题“Little_Big_endian....

    Big-and-Little-Endian.rar_LIt_endian_little

    在计算机科学中,大端字节序(Big-Endian)和小端字节序(Little-Endian)是两种主要的数据存储方式,对于理解和编写跨平台应用程序的开发者来说至关重要。这两种字节序涉及到如何在内存中存储多字节数据类型,如...

    大端(Big_Endian)与小端(Little_Endian)简介

    在计算机科学领域,大端(Big Endian)与小端(Little Endian)指的是数据(特别是多字节整数)在内存中存储时的字节顺序。这两种表示方法主要应用于不同类型的计算机体系结构中,对软件开发尤其是跨平台编程具有...

    字符编码转换类,支持 ANSI、Unicode、Unicode big endian、UTF-8、UTF-8+Bom互相转换

    2. Unicode:这是一个标准,定义了所有已知字符的唯一数字表示,分为Little Endian和Big Endian两种字节顺序。Little Endian先存储低字节,Big Endian则先存储高字节。 3. UTF-8:一种变长的Unicode编码,用1到4个...

    little endian,big endian 小端存储、大端存储.zip

    little endian,big endian 小端存储、大端存储.zip

    Macro-test-mode-test-system.zip_endian_little endian

    Endianness 主要分为两种:大端法(Big Endian)和小端法(Little Endian)。这个名为 "Macro-test-mode-test-system.zip_endian_little_endian" 的压缩包文件是为了帮助用户检测他们的个人计算机(PC)使用的是哪种...

    字符编码转换 Text、ANSI、Unicode、Unicode Big Endian、UTF-8、UTF-7

    本篇文章将深入探讨标题中提及的几种字符编码:Text、ANSI、Unicode(包括Little Endian和Big Endian)、UTF-8以及UTF-7,并介绍它们之间的转换。 1. **Text编码**: 在Windows系统中,通常所说的"Text"编码是指...

    大端(Big Endian)与小端(Little Endian)简介.doc

    大端(Big Endian)与小端(Little Endian)是指计算机系统中多字节数据在内存中的存储方式。这个概念主要涉及到处理器架构和数据表示,对于跨平台编程和网络通信尤其重要。Endianness的问题源于不同的计算机系统...

    STM32F103CB_Big_Little_Endian_Demo.zip

    基于STM32HAL库,USART-调试串口(大小端测试),对应文章:https://blog.csdn.net/qq_36075612/article/details/115935138?spm=1001.2014.3001.5501

    字节存储顺序: little-endian小端,big-endian大端 教程

    你是否遇到过,内存中的数据顺序颠倒 你存入1234,实际存储的是3412. 字节存储顺序: little-endian小端,big-endian大端 教程 主机序,网络序 hton,ntoh

    西门子PLC接口,大端和小-Endian的存储格式.pdf

    西门子PLC接口,大端和小-Endian的存储格式pdf,西门子PLC接口,大端和小-Endian的存储格式:本文介绍了SINUMERIK:PLC接口,和Little-Endian的Big-Endian的存储格式

    is-little-endian:检查您的系统是否为小端

    buffer ) ) [ 0 ] === 0x04030201 )用法使用 npm 安装: npm install is-little-endian然后像这样使用它: if ( require ( "is-little-endian" ) ) { // Use little endian buffer} else { // Use big endian ...

    解析大端模式和小端模式

    目前主要存在两种字节序类型:大端模式(Big Endian)与小端模式(Little Endian)。这两种模式直接影响着程序在不同系统之间的兼容性以及网络通信中数据包的解码。 #### 大端模式(Big Endian) 大端模式是指在多...

    判断CPU大小端模式

    请写一个C函数,若处理器是Big_endian的,则返回 0;若是Little_endian的,则返回1。 • 函数原型:int checkCPU( );

    网络字节序和主机字节序

    常见的有两种字节序:Little Endian(小端字节序)和 Big Endian(大端字节序)。Little Endian 将低序字节存储在起始地址,而 Big Endian 将高序字节存储在起始地址。 Little Endian 最符合人的思维的字节序,因为...

Global site tag (gtag.js) - Google Analytics