大端序和小端序字节顺序的区别

77

大端序和小端序字节序有什么区别?

这两者都与Unicode和UTF16有关。我们在什么情况下使用它们?


5
http://en.wikipedia.org/wiki/Endianness - Mitch Wheat
不要忘记中端字节序。它在维基页面上。 - Jason Punyon
4
“对于几乎所有问题都可以这样说。” - Jon B
1
@Jon B:是的,可以这样做,但有些问题最好通过持续的研究来回答,而不是仅凭一些专家给出的答案。 - Cerebrus
@BALAMURUGAN:大端和小端只在存在多字节数据时才会出现。 - Dead Programmer
很好地解释了大端和小端字节顺序。http://betterexplained.com/articles/understanding-big-and-little-endian-byte-order/ - Atiq
5个回答

129

大端序(BE)/小端序(LE)是组织多字节单词的两种方式。例如,在使用两个字节来表示UTF-16字符时,有两种方式可以将字符0x1234表示为一个字节串(0x00-0xFF):

Byte Index:      0  1
---------------------
Big-Endian:     12 34
Little-Endian:  34 12
为了确定一个文本是使用UTF-16BE还是UTF-16LE,规范建议在字符串前添加一个字节顺序标记(BOM),表示字符U+FEFF。因此,如果UTF-16编码的文本文件的前两个字节是FEFF,则编码为UTF-16BE。如果是FFFE,则为UTF-16LE。
视觉示例:不同编码(带有BOM的UTF-16)的单词“Example”。
Byte Index:   0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
------------------------------------------------------------
ASCII:       45 78 61 6d 70 6c 65
UTF-16BE:    FE FF 00 45 00 78 00 61 00 6d 00 70 00 6c 00 65
UTF-16LE:    FF FE 45 00 78 00 61 00 6d 00 70 00 6c 00 65 00

如需更多信息,请阅读 字节序 和/或 UTF-16 的维基百科页面。


字节序在计算机中一直是一个令人费解的问题,因为大端模式将最高有效字节存储在最小地址中,而不是最后/末尾地址。无论如何,这个网站可以澄清一切,大端和小端,在大端模式中,你将最高有效字节存储在最小地址中。顺便说一下,“可视化示例”非常有帮助。 - bvj
在大端模式中,你将最高有效字节存储在最小地址中。或者说,在大端模式中,你将最低有效字节存储在最大地址中,这是同样的道理。 - Lakey
2
链接已损坏@bvj,这个有效:https://www.cs.umd.edu/~meesh/cmsc311/clin-cmsc311/Lectures/lecture6/endian.htm - eric
我仍然不明白这个答案如何帮助我决定我应该为我的字幕文件选择BE还是LE。 - zhuhang.jasper

36

Ferdinand的回答(和其他人的回答)是正确的,但不完整。

大端序(BE)/小端序(LE)与UTF-16或UTF-32无关。 它们早在Unicode之前就存在,并影响数字字节在计算机内存中的存储方式。它们取决于处理器。

如果您有一个值为0x12345678的数字,则在内存中表示为12 34 56 78(BE)或78 56 34 12(LE)。

UTF-16和UTF-32恰好分别用2个和4个字节表示,因此字节顺序遵循该平台上任何数字遵循的排序规则。


8
UTF-16将Unicode编码为16位值。现代大多数文件系统都是基于8位字节的。因此,例如要将UTF-16编码的文件保存到磁盘中,您必须决定16位值的哪一部分放在第一个字节中,哪一部分放在第二个字节中。
维基百科提供了更完整的解释:链接

1
这个回答是不正确的。字节序与底层硬件架构有关。 - Mitch Wheat
7
无论底层硬件如何,您都可以以任意字节顺序存储UTF-16编码的文件。 - joev
1
在问题的背景下,我认为这个答案是完全可以接受的。 - Binary Worrier
@joev:没错。它通常与硬件架构有关,但不一定如此。为了实现跨平台兼容性,Unicode编码器/解码器应该能够使用任何字节序。 - Noldorin

5

little-endian: adj.

描述一种计算机架构,在给定的16位或32位字中,低地址的字节具有较低的重要性(单词以“little-end-first”存储)。PDP-11和VAX系列计算机、英特尔微处理器以及许多通信和网络硬件都采用小端序。该术语有时用于描述除字节之外的其他单元的排序;最常见的是字节内的位。

big-endian: adj.

[常见;来源于斯威夫特的《格利佛游记》,通过丹尼·科恩(Danny Cohen)的著名论文“关于圣战和和平的呼吁”,该论文发布于1980年4月1日]

描述一种计算机架构,在给定的多字节数字表示中,最高有效字节具有最低地址(单词以“big-end-first”存储)。大多数处理器,包括IBM 370系列、PDP-10、摩托罗拉微处理器系列和大多数各种精简指令集(RISC)设计都采用大端序。大端序也有时称作网络序。

---来自Jargon File:http://catb.org/~esr/jargon/html/index.html


1

字节序(大端或小端)需要为Unicode / UTF-16编码指定,因为对于使用多个字节的字符代码,有一种选择是先读/写最高有效字节还是最低有效字节。 Unicode / UTF-16由于它们是可变长度编码(即每个字符可以由一个或多个字节表示),因此需要指定这一点。(但请注意,UTF-8“单词”始终为8位/一个字节的长度[虽然字符可以是多个点],因此不存在字节序问题。)如果表示Unicode文本的字节流的编码器和解码器没有就使用哪种约定达成一致,则可能会解释错误的字符代码。因此,要么事先知道字节序的约定,要么更常见的做法是在任何Unicode文本文件/流的开头通常指定字节顺序标记以指示使用大端或小端顺序。


1
UTF-8是一种可变长度编码,每个字符使用1到6个字节,因此不像单字节编码那样固定为一个字节! - Ferdinand Beyer
@Ferdinand:你说得对 - 我应该提到一些UTF-8变体不需要它... - Noldorin
1
仅为完整性而言 - UTF-8需要1到4个字节。有效的UTF-8不能超过4个字节。 - Nemanja Trifunovic
1
@Ferdinand:是的,我已经意识到了你最初的纠正。帖子已经再次澄清,因为我理解了你的观点...尽管我在自我纠正的过程中有些困惑。 :P - Noldorin
2
http://unicode.org/faq/utf_bom.html 看起来是同意的,但如果我错了,请纠正我... - Noldorin
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接