大端与小端,大尾与小尾,高尾端与低尾端,主机字节序与网络字节序
概念剖析
一时记忆与理解大端、小端的概念很容易,但时间一长,对于相似的概念人类的记忆向来是模糊的,甚至是换位的。所以除非你的记忆非常牢靠,否则借助大端和小端这样的名字,你很难将概念与内容联系紧密。
也有文章提到用大尾与小尾的概念,个人觉得这个概念还是没有解决存储概念中的基本问题,大与小还是没有脱离以前的概念,但是引入了尾的概念,已经比大端与小端要更清晰一点。
目前对于记忆大小端,我觉得这篇文章中提到的高尾端/低尾端名词记忆方法比较科学、形象。实话说,当时计算机科学著作翻译Big Endian与Small Endian时,确实没有考虑中国人理解的问题,直译显得生硬,还未做到信达雅的境界。
刚才我们提到存储概念中的基本问题,其实就是两个:一是对于一个数据,如何标示它的头尾;二是头尾在内存中排列的顺序。基于这两个基本问题,我认为高尾端/低尾端这样的叫法是最科学,最贴近存储实情的。其中尾用于表示数据的尾端字节,如int
型数据0x1122AABB
中0xBB
即是尾。高
、低
就更好理解了,指的是存储地址的高低。综合来说就是:
高尾端:数据的尾端字节存储在内存的高地址。即头端字节存储在内存的低地址,数据依序增加存储。
低尾端:数据的尾端字节存储在内存的低地址。即头端字节存储在内存的高地址,数据依序递减存储。
从这两个概念中,我们可以发现,高尾端存储方式比较符合人类的直观思维方式,地址依序增加,数据依序从头端后移,两者呈完美的顺位对应。而低尾端这种方式很是别扭,显得很反人类。
因此,一般的网络通讯中,我们为了方便人类的习惯,采用高尾端传输方式,也就是大端方式。网络中数据流的传输顺序被称为网络字节序。由此对应一个概念就是主机字节序,也就是数据在主机中存储的方式。因此,在网络传输中,不同的主机有不同的字节序,传输前一定要转换成网络字节序,否则会引起数据传输的错误。
直观理解
上一小节中已经对于各种概念进行了描述,其中相应的关系也给出了,在实际工作中,大家还是习惯性的使用大小端的概念,刚才我也提到了,这种叫法不利于记忆与理解,因此推荐大家使用高尾端/低尾端的概念,两者之前的对应关系还是很明显的,甚至在不需要我说明的情况下,大家凭经验就可以知道高尾端对应大端,低尾端对应小端。
这一节主要细化这两个一一对应的概念,让大家有更直观的感受。
一般来说,计算机内存中都是以字节(Byte)为基本单位,那么对于一个int
型数据,它在内存中的存储方式有两种,这就是大端存储与小端存储。以上节数据0x1122AABB
为例,假设存储在地址为0x91000000
的内存处。很显然,它需要占用四个内存地址,从0x91000000
-0x91000003
。
地址 | 0x91000000 | 0x91000001 | 0x91000002 | 0x91000003 |
---|---|---|---|---|
大端 | 11 | 22 | AA | BB |
小端 | BB | AA | 22 | 11 |
很自然,大家会觉得大端存储方式符合人类的习惯,这种存储方式就是将数据的尾端字节存储在高地址。上面的描述倒是怪怪的。但不论怎么说,高尾端/低尾端方式包含了存储问题中的两个基本要点,只要稍加思维,就可以将概念与内容对应上来。
如果这篇文章帮助到了你,你可以请作者喝一杯咖啡