Posted on 2006-11-07 13:29
nemo 阅读(4847)
评论(4) 编辑 收藏
今天研究SHA-1算法源码,发现注释中一个词怎么也搞不懂:Big-Endian. 在网上查了才知道是大端在前的意思。在http://blog.vckbase.com/smileonce/archive/2005/02/22/3202.aspx 和 http://blog.myrice.com/reddenedmaple/archives/50001922.html中有比较多地介绍。但是很乱,我整理了一下,并加入了自己的一些理解。感谢提供信息的人们。
这两个术语来自于 Jonathan Swift 的《《格利佛游记》其中交战的两个派别无法就应该从哪一端--小端还是大端--打开一个半熟的鸡蛋达成一致。
在那个时代,Swift是在讽刺英国和法国之间的持续冲突,Danny Cohen,一位网络协议的早期开创者,第一次使用这两个术语来指代字节顺序,后来这个术语被广泛接纳了,成为计算机专用名词。除网络传输之外,在计算机硬件中也有使用,通常表示逻辑最小处理单元大于物理最小处理单元时逻辑单元与物理单元的映射方式。
由于这个概念第一次提出时是来指代字节顺序,而且计算机物理最小处理单元通常为一个字节,所以通常情况下无论是大端还是小端都是以字节(8bit)计,在字节之内都是以大端顺序排列。但不排除以后随着计算机的发展将这个数字扩充。
字节排序 | 含义 |
---|
Big-Endian | 高位在前,低位在后。 |
Little-Endian | 低位在前,高位在后 |
请看下面这个例子:
如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x34 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12
然后,假如需要从内存中取32位整数0x1234abcd中的高16位整数,就需要知道是不是big-endian,如果是,需要从0x0002地址中去取,如果是little-endian,则需要从0x0000中取。也即怎么存就怎么取。
为什么会出现这样的情况呢?为什么要有这两种方式来排列数据?我们可以看看Dr. William T. Verts所作的说明: