最近在教大恩迪与小恩迪恩之战时,一个学生问它是否已经解决,我意识到我不知道。查看Wikipedia文章,似乎当前最流行的OS /体系结构对使用Little Endian,但是Internet协议指定Big Endian用于在数据包头中传输数值。这将是当前状态的一个很好的总结吗?当前的网卡或CPU是否为切换字节顺序提供硬件支持?
最近在教大恩迪与小恩迪恩之战时,一个学生问它是否已经解决,我意识到我不知道。查看Wikipedia文章,似乎当前最流行的OS /体系结构对使用Little Endian,但是Internet协议指定Big Endian用于在数据包头中传输数值。这将是当前状态的一个很好的总结吗?当前的网卡或CPU是否为切换字节顺序提供硬件支持?
Answers:
我认为,与其说赢得胜利,不如说不再重要。基本上构成整个移动市场的ARM是按字节顺序排列的(哦,这是异端!)。从某种意义上讲,x86基本上“赢得了”台式机市场,我想您可以说赢得了很少的endian,但是我认为,鉴于当今许多应用程序的整体代码深度(浅)和抽象(很多),这比问题要少得多它曾经是。我不记得在我的计算机体系结构课程中确实出现了字节序。
我怀疑许多开发人员甚至没有意识到字节序或字节序为什么很重要。因为对于绝大多数(我指的是绝大多数)来说,这与他们的日常工作环境完全无关。这与30年前的情况有所不同,当时每个人都在编写代码,使其更接近金属,而不是以花哨且生动的方式操纵屏幕上的文本文件。
我的普遍怀疑是,由于良好的OO系统中的访问层和抽象层对用户隐藏了实现细节,因此面向对象编程才是开始关注字节序的起点。由于实现包括字节顺序,因此人们已经习惯了它不是一个显式因素。
附录:zxcdw提到了可移植性。但是,在过去20年中,复仇发生了什么?在虚拟机上构建的编程语言。当然,虚拟机的字节序可能很重要,但是对于一种语言,它可以变得非常一致,以至于基本上它不是问题。从可移植性的角度来看,只有VM实现者甚至不必担心字节序。
x & 0xFF
始终为您提供最低有效字节,而与字节序无关(假设每个字节为8位),因为您已按其值指定了感兴趣的位,而不是它们在内存中的相对位置。
字节序仅在传输二进制数据系统时才真正重要。
随着处理器速度的提高(以及更低的存储成本),二进制数据接口变得越来越稀有,因此您不会在应用程序层注意到它们。您正在使用文本传输格式(XML / JSON)或正在使用数据层抽象来为您处理翻译(因此您甚至不会注意到有翻译)。
但是,当您在二进制数据层进行编码时,您确实会注意到,这非常重要。例如,当我在VERITAS(现在是Symantec)工作时,我正在构建在25种不同的硬件平台上构建的软件(不仅大/小字节序,还有其他类型)。
(char) (x & 0xFF)
在C语言中,不管字节顺序如何,它都为您提供了最低有效字节,并假设仅一个字节为8位。我在设计二进制文件格式时并不知道该软件将在其上运行的机器-我基本上选择了字节序排序的文件格式,而无需关心硬件。
不,没有人赢。作为一个物种,我们未能规范存储字节的顺序,写入的方向和行进的路边。
结果,任何想要通过网络或文件在两个不同系统之间传输数据的人,只有大约50%的机会可以在他们的环境中正确地使用其数据转储代码的合理初始版本,即使它可以正常工作,有50%的机会在其客户中工作。
为了解决这个问题,您需要在特定于标题的名称中查找平台特定的函数,例如“ htonl”,其名称显然可以追溯到70年代,例如“ arpa / inet.h”,因为此后情况一直没有改善,并且可能永远不会。
仍然没有共识:
因此,在硬件级别,LE更为常见。但:
在可预见的将来,这两个订单将与我们同在。