大端序和小端序字节序有什么区别?
这两者都与Unicode和UTF16有关。我们在什么情况下使用它们?
大端序和小端序字节序有什么区别?
这两者都与Unicode和UTF16有关。我们在什么情况下使用它们?
大端序(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编码的文本文件的前两个字节是FE
和FF
,则编码为UTF-16BE。如果是FF
和FE
,则为UTF-16LE。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
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个字节表示,因此字节顺序遵循该平台上任何数字遵循的排序规则。
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
字节序(大端或小端)需要为Unicode / UTF-16编码指定,因为对于使用多个字节的字符代码,有一种选择是先读/写最高有效字节还是最低有效字节。 Unicode / UTF-16由于它们是可变长度编码(即每个字符可以由一个或多个字节表示),因此需要指定这一点。(但请注意,UTF-8“单词”始终为8位/一个字节的长度[虽然字符可以是多个点],因此不存在字节序问题。)如果表示Unicode文本的字节流的编码器和解码器没有就使用哪种约定达成一致,则可能会解释错误的字符代码。因此,要么事先知道字节序的约定,要么更常见的做法是在任何Unicode文本文件/流的开头通常指定字节顺序标记以指示使用大端或小端顺序。