Big-endian和little-endian是描述排列存储在计算机内存里的字节序列的术语。Big-endian是一种大值的一端(序列中更典型值)存在前面(在最小的存储地址)的顺序。Little-endian是一种小值的一端(序列中较不典型的值)存储在前的顺序。比如,在Big- endian的电脑中,需要两个字节把十六位数4F52当作4F52存在存储器中(如果4F存在存储地址1000中,比如说,52将存在1001中)。在 little-endian系统里,将被存为524F(52存在存储地址1000中,比如说,4F将存在1001中)。 IBM的370主机,多数基于 RISC计算机,和Motorola的微处理器使用big-endian方法。TCP/IP也使用big-endian方法(因此big-endian方法也叫做网络编码)。对于人来说我们的语言都是从左到右的习惯方式。这看上去似乎被认为是自然的存储字符和数字方式-你同样也希望以同样的方式出现在你面前。我们总的许多人因此也会认为big-endian是流行的存储方式,正如我们平时所读到的。 另一个方面说,Intel处理器(CPUs)和DEC Alphas和至少一些在他们的平台的其他程序都是little-endian的。有个关于little-endian的争议是如果你增加数字的值,你可能在左边增加数字(高位非指数函数需要更多的数字)。因此,经常需要增加两位数字并移动存储器里所有Big-endian顺序的数字,把所有数向右移。使用little-endian的存储器中不重要的字节可以存在它原来的位置,新的数可以存在它的右边的高位地址里。这就意味着有些计算机的运作可以变得简单和快速。 语言编译器比如说Java或FORTRAN必须明确他们开发的目标代码使用的是什么存储方式。有必要的话可以使用转换器可以用来转换存储顺序。 注意在使用big-endian和little-endian字节顺序中,一个位里面都是使用big-endian。也就是说,在存储的字节里一个位串代表的给定数没有big-endian和little-endian之分。比如说,有个十六位数4F放在一个给定的字节地质前面或者后面,在这个字节的这一位的里的顺序是: 01001111 从这一位的顺序来看有可能是big-endian也可能是little-endian,但是CPUs和程序几乎都是设计成big-endian位序的。尽管如此在数据的交换中它有可能其中的一种顺序。 Eric Raymond评述说Internet域名地址和e-mail地址是little-endian的。比如我们的网址用big-endian来表述是 com.whatis.www Big-endian和little-endian来自于Jonathan Swift的Gulliver's Travels ,Big-endian是那个大鸡蛋是打破大头的那个政治派别而反对派Lilliputian King要求他的国民打鸡蛋的时候用小的那一头。
目前的存储器,多以byte为访问的最小单元,当一个逻辑上的整理必须分割为物理上的
若干单元时就存在了先放谁后放谁的问题,于是endian的问题应运而生了,对于不同的
存储方法,就有Big-endian和Little-endian两个描述.(这两个术语来自于 Jonathan
Swift 的《《格利佛游记》其中交战的两个派别无法就应该从哪一端--小端还是大
端--打开一个半熟的鸡蛋达成一致。在那个时代,Swift是在讽刺英国和法国之间
的持续冲突,Danny Cohen,一位网络协议的早期开创者,第一次使用这两个术语
来指代字节顺序,后来这个术语被广泛接纳了。)
存在“如果说"跟word或者说字长根本就没关系",假设有一数据文件里面有N多数顺
序排布,如果想以Little-Endian format 读入内存某区域,那么应该怎么读?怎么
排?”这样的问题是由于对于endian的实质理解的偏差,endian指的是当物理上的最
小单元比逻辑上的最小单元小时,逻辑到物理的单元排布关系。这里的“有一数据文
件里面有N多数顺序排布”,这个“有一数据”显然不是逻辑上的最小单元,而其中
的“N多数”的一个才是逻辑最小单元,于是可应用楼主表格中的原则排列,而“N多
数”之间的顺序则是由这“N多数”的宿主决定的,比如是你写的程序,这个顺序由你
决定
刚才谈到了,endian指的是当物理上的最小单元比逻辑上的最小单元小时,逻辑到
物理的单元排布关系。咱们接触到的物理单元最小都是byte,在通信领域中,这里
往往是bit,不过原理也是类似的。
实践可以给你更多的经验,比如在一个嵌入式系统的通信协议中,从底层射频驱动
到上层的协议栈全部需要实现,那么很可能遇到多个endian的问题,底层的bit序、
协议层的byte序、应用层的byte序,这些都是不同的概念
Big-Endian 和 Little-Endian 字节排序
字节排序 含义
Big-Endian 一个Word中的高位的Byte放在内存中这个Word区域的低地址处。
Little-Endian 一个Word中的低位的Byte放在内存中这个Word区域的低地址处。
必须注意的是:表中一个Word的长度是16位,一个Byte的长度是8位。如果一个数
超过一个Word的长度,必须先按Word分成若干部分,然后每一部分(即每个Word
内部)按Big-Endian或者Little-Endian的不同操作来处理字节。
一个例子:
如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x34 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12
除了moto的68K系列和dec的sparc是big endian外,常见的cpu都是little
endian。ARM同时支持 big和little,实际应用中通常使用little endian。
-----------------------------------------
Big-Endian CPU
依照 CPU 設計的不同, 當資料寬度超過一個位元組 (BYTE) 以上時, 將高位元組擺在前面稱為 BIG-ENDIAN, 相反的方式稱為
LITTLE-ENDIAN.例如 "ECHO" 在 LITTLE-ENDIAN 系統使用兩組兩個位元組 (WORDS) 來儲存字串時,
記憶體內排列應該是 "CEOH", 在 BIG-ENDIAN 系統則是 "ECHO".HP, IBM, MOTOROLA 68K 系列使用
BIG-ENDIAN 設計.INTEL X86, DEC VAX 使用 LITTLE-ENDIAN 設計.POWERPC 支援兩種格式, 稱為
BI-ENDIAN.
阅读(1246) | 评论(0) | 转发(0) |