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 文本文件/流的开头指定,以指示使用的是大端还是小端。