Little Endian赢了吗?


34

最近在教大恩迪与小恩迪恩之战时,一个学生问它是否已经解决,我意识到我不知道。查看Wikipedia文章,似乎当前最流行的OS /体系结构对使用Little Endian,但是Internet协议指定Big Endian用于在数据包头中传输数值。这将是当前状态的一个很好的总结吗?当前的网卡或CPU是否为切换字节顺序提供硬件支持?

Answers:


25

我认为,与其说赢得胜利,不如说不再重要。基本上构成整个移动市场的ARM是按字节顺序排列的(哦,这是异端!)。从某种意义上讲,x86基本上“赢得了”台式机市场,我想您可以说赢得了很少的endian,但是我认为,鉴于当今许多应用程序的整体代码深度(浅)和抽象(很多),这比​​问题要少得多它曾经是。我不记得在我的计算机体系结构课程中确实出现了字节序。

我怀疑许多开发人员甚至没有意识到字节序或字节序为什么很重要。因为对于绝大多数(我指的是绝大多数)来说,这与他们的日常工作环境完全无关。这与30年前的情况有所不同,当时每个人都在编写代码,使其更接近金属,而不是以花哨且生动的方式操纵屏幕上的文本文件。

我的普遍怀疑是,由于良好的OO系统中的访问层和抽象层对用户隐藏了实现细节,因此面向对象编程才是开始关注字节序的起点。由于实现包括字节顺序,因此人们已经习惯了它不是一个显式因素。

附录:zxcdw提到了可移植性。但是,在过去20年中,复仇发生了什么?在虚拟机上构建的编程语言。当然,虚拟机的字节序可能很重要,但是对于一种语言,它可以变得非常一致,以至于基本上它不是问题。从可移植性的角度来看,只有VM实现者甚至不必担心字节序。


2
仍然有许多非常相关的领域,例如编写任何形式的可移植代码时。实际上,可能无关紧要的是编写与平台相关的非便携式代码时的情况。
zxcdw 2012年

@zxcdw将我们直接带到了虚拟机语言大军中……我没有想到这一点。
世界工程师

您的附录并不完全正确(我也不同意@zxcdw):字节序仅在多字节整数和字节流之间转换时才重要,而当隐式完成并在平台之间变化时,便成为问题。大多数现代语言(无论是否基于VM)都通过很少进行操作(使用整数作为不透明的数据类型)来实现可移植性,然后具有独立于平台或由程序员明确选择的字节序。
Michael Borgwardt 2012年

2
@MichaelBorgwardt ARM做了arium.com/pdf/Endianness.pdf
世界工程师

2
@zxcdw-即使在汇编程序中,您也不总是需要知道字节序。例如,不需要一次指定一个字节的常量。这种情况有点类似于C中的某种序列化样式- x & 0xFF始终为您提供最低有效字节,而与字节序无关(假设每个字节为8位),因为您已按其值指定了感兴趣的位,而不是它们在内存中的相对位置。
2012年

4

字节序仅在传输二进制数据系统时才真正重要。

随着处理器速度的提高(以及更低的存储成本),二进制数据接口变得越来越稀有,因此您不会在应用程序层注意到它们。您正在使用文本传输格式(XML / JSON)或正在使用数据层抽象来为您处理翻译(因此您甚至不会注意到有翻译)。

但是,当您在二进制数据层进行编码时,您确实会注意到,这非常重要。例如,当我在VERITAS(现在是Symantec)工作时,我正在构建在25种不同的硬件平台上构建的软件(不仅大/小字节序,还有其他类型)。


我的学生还为手机开发并使用了云计算,因此他们知道世界不是PC和Mac。
艾伦·斯珀特斯

@Loki-可以在不知道机器字节序的情况下进行序列化和反序列化。您只真正需要知道文件/流/任何文件中数据的字节顺序。例如,(char) (x & 0xFF)在C语言中,不管字节顺序如何,它都为您提供了最低有效字节,并假设仅一个字节为8位。我在设计二进制文件格式时并不知道该软件将在其上运行的机器-我基本上选择了字节序排序的文件格式,而无需关心硬件。
2012年

@espertus:当然可以。
马丁·约克

1
@ Steve314:是的,当然可以。当您在“二进制数据层”上工作时,可以设计出想要序列化数据的任何方案,并且设计出可移植的方案并不难。虽然我个人不愿意重新发明自60年代以来就已经制造并经过良好测试的车轮。查找` h2nl和家人。该功能家族提供了一种可移植(标准)的操作方式,该方式最适合您的平台。
马丁·约克

4

不,没有人赢。作为一个物种,我们未能规范存储字节的顺序,写入的方向和行进的路边。

结果,任何想要通过网络或文件在两个不同系统之间传输数据的人,只有大约50%的机会可以在他们的环境中正确地使用其数据转储代码的合理初始版本,即使它可以正常工作,有50%的机会在其客户中工作。

为了解决这个问题,您需要在特定于标题的名称中查找平台特定的函数,例如“ htonl”,其名称显然可以追溯到70年代,例如“ arpa / inet.h”,因为此后情况一直没有改善,并且可能永远不会。


10
事实证明,我们已经标准化了-我们不是发送4个字节来表示整数,而是发送带有特殊标题文本,尖括号,关键字和这4个字节的ASCII表示格式的文本块。接收端然后解析格式以获取整数文本,并将其转换回4个字节。有人告诉我这叫做进度:-)
gbjbaanb

$ aptitude搜索xml | wc -l 677
安德鲁·瓦格纳

1

仍然没有共识:

  • 当前,大多数大型计算机系统(服务器/台式机/笔记本电脑)都使用低字节序架构
  • 大多数较小的计算机(平板电脑/电话)使用与字节序无关的处理器体系结构,但运行使用低字节序的操作系统

因此,在硬件级别,LE更为常见。但:

  • 大多数计算机间通信都是使用指定大端顺序的协议执行的
  • 世界上有很大一部分软件在虚拟平台上运行,该虚拟平台在将数据写入外部存储时默认为big-endian顺序。

在可预见的将来,这两个订单将与我们同在。


大多数最大的系统(即“大铁”)通常是big-endian。就是说,所谓的小型或大型机系统(构成了我们大多数人不关心的大量后端处理。)

@jdv但是大多数最大的 计算系统都是小的endian x86-64机器,因此性能很重要。
user877329

我认为没有任何人可以断言,字节序对架构设计师而言(就他们想要实现的目标而言)不只是便利。在我发表那条古老的评论时,铁就是BE。但这不是因为它是BE,而是因为架构恰好就是这种方式。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.