2.2.3 字节排序【译】

      一个字中的字节可以从左向右或从右向左编号。乍一看这个顺序不是很重要,很快我们将看到它的着重大意义。图2-11(a)描绘了32位计算机内存的一部分,该机器上字节编号的顺序是从左到右,就像SPARC或者大型IBM处理器。图2-11(b)给出了从右向左编号字节的32位计算机的相似表示,就像Inter家族。具有前者这种编号从“大”端开始的系统,称作大端计算机,和图2-11(b)的小端形成对照。这两术语起源于乔纳森·斯威夫特,他写的《格列夫游记》讽刺了那些由于小小争论而发起战争的政治家,该争论是关于鸡蛋应该从大的一头还是小的一头打破。这些术语最早在Cohen的一篇精妙的文章中出现,用于描述计算机体系结构。

      理解大端和小端系统很重要,一个32位整数6用小端法表示,该字最右边3位是110,左边有29位的0。如果是大端法,110在字节3(或7,或11,等等)中,在小端法它们在字节0(或4,或8,等等)中。在这两种情况下,包含这个整数的字都有地址0。

      如果计算机只保存整数,没有任何问题。然而,很多应用程序需要整数,字符串和其他数据类型的混合。假设有一条简单的个人信息记录,包括一个字符串(雇员姓名)和两个整数(年龄和部门编号)。字符串结束时用一或多个0字节来填满一个字。“Jim Smith,年龄21,部门260”这条信息的大端表示如图2-12(a),小端表示如图2-12(b)。

       这两种表示都可以,它们是描述的内容是一样的。当一台机器尝试把记录通过网络发送给另一台时问题就来了。假设大端机器把记录一字节一字节的发送给小端机器,从字节0开始,到字节19结束。(我们乐观地假设字节在传输过程中没有翻转)因此大端机器的字节0进入小端机器内存的字节0,如图2-12(c)所示。

      当小端机器尝试打印姓名时没有问题,但是年龄变成21*2^24,部门也乱掉了。这个问题产生的原因在于传输过程中翻转了字中字符的顺序,也翻转了整数中的字节。

      一个显而易见的解决方案是,在生成传输副本后由软件来翻转字里面的字节。如图2-12(d),两个整数没什么问题但是字符串翻转成了“MIJTIMS,"H”在很远的地方。字符串发生这种翻转的原因是,当读取时,计算机首先读取字节0(空格),然后是字节1(M),等等。

      没有简单的解决方案。有一种有用但是效率很低的方法,在每个数据项前插入一个头部,声明后面跟随的数据类型(字符串,整数,以及其他)和数据长度。这允许接受者只执行必要的转换。无论如何,有一点是很清楚的:在不同机器间传输数据时,没有标准化的字节排序是个大问题。

posted @ 2019-10-18 12:34  夕晖  阅读(348)  评论(1编辑  收藏  举报