Big Endian 和 Little Endian Byte order 有什么区别?
这两者似乎都与 Unicode 和 UTF16 有关。我们究竟在哪里使用它?
Big Endian 和 Little Endian Byte order 有什么区别?
这两者似乎都与 Unicode 和 UTF16 有关。我们究竟在哪里使用它?
Big-Endian (BE) / Little-Endian (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。
一个视觉示例:不同编码中的“示例”一词(带有 BOM 的 UTF-16):
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
有关更多信息,请阅读Endianness和/或UTF-16的 Wikipedia 页面。
费迪南德(和其他人)的回答是正确的,但不完整。
Big Endian (BE) / Little Endian (LE) 与 UTF-16 或 UTF-32 无关。它们在 Unicode 之前就存在了,并且会影响数字字节在计算机内存中的存储方式。它们取决于处理器。
如果您有一个带有该值的数字,0x12345678
那么在内存中它将表示为12 34 56 78
(BE) 或78 56 34 12
(LE)。
UTF-16 和 UTF-32 恰好分别在 2 个和 4 个字节上表示,因此字节的顺序尊重任何数字在该平台上遵循的顺序。
UTF-16 将 Unicode 编码为 16 位值。大多数现代文件系统在 8 位字节上运行。因此,例如,要将 UTF-16 编码文件保存到磁盘,您必须决定 16 位值的哪一部分进入第一个字节,哪些进入第二个字节。
维基百科有更完整的解释。
小端:adj.
描述了一种计算机体系结构,其中在给定的 16 位或 32 位字中,较低地址的字节具有较低的重要性(该字以“小端优先”的方式存储)。PDP-11 和 VAX 系列计算机和 Intel 微处理器以及许多通信和网络硬件都是 little-endian。该术语有时用于描述字节以外的单位的顺序;最常见的是一个字节内的位。
大端:形容词。
[常见的; 摘自 Swift 的《格列佛游记》,来自丹尼·科恩 (Danny Cohen) 的著名论文《圣战与和平恳求》,USC/ISI IEN 137,1980 年 4 月 1 日]
描述了一种计算机体系结构,在该体系结构中,在给定的多字节数字表示中,最高有效字节具有最低地址(该字存储为“大端优先”)。大多数处理器,包括 IBM 370 系列、PDP-10、摩托罗拉微处理器系列,以及大多数各种 RISC 设计都是大端的。Big-endian 字节顺序有时也称为网络顺序。
Big-endian 和 little-endian 是描述字节序列在计算机内存中存储顺序的术语。
例如
在大端计算机中,十六进制数所需的两个字节4F52
将存储4F52
在 storage 中(if 4F is stored at storage address 1000, for example, 52 will be at address 1001).
在小端系统中,它将被存储为524F (52 at address 1000, 4F at 1001).
需要为 Unicode/UTF-16 编码指定字节字节序(大或小),因为对于使用多个单个字节的字符代码,可以选择是先读/写最高有效字节还是最后读/写最高有效字节。Unicode/UTF-16,因为它们是可变长度编码(即每个字符可以用一个或多个字节表示),所以需要指定。(但请注意,UTF-8“字”的长度始终为 8 位/一个字节[尽管字符可以是多个点],因此字节序没有问题。)如果表示 Unicode 文本的字节流的编码器和解码器未就使用的约定达成一致,可能会解释错误的字符代码。出于这个原因,要么事先知道字节顺序的约定,要么更常见的是字节顺序标记通常在任何 Unicode 文本文件/流的开头指定,以指示使用的是大端还是小端。