71

Big Endian 和 Little Endian Byte order 有什么区别?

这两者似乎都与 Unicode 和 UTF16 有关。我们究竟在哪里使用它?

4

6 回答 6

121

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 页面。

于 2009-03-31T15:41:43.930 回答
33

费迪南德(和其他人)的回答是正确的,但不完整。

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 个字节上表示,因此字节的顺序尊重任何数字在该平台上遵循的顺序。

于 2009-07-24T08:30:13.297 回答
8

UTF-16 将 Unicode 编码为 16 位值。大多数现代文件系统在 8 位字节上运行。因此,例如,要将 UTF-16 编码文件保存到磁盘,您必须决定 16 位值的哪一部分进入第一个字节,哪些进入第二个字节。

维基百科有更完整的解释。

于 2009-03-31T15:44:23.033 回答
4

小端: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 字节顺序有时也称为网络顺序。

---来自行话文件:http ://catb.org/~esr/jargon/html/index.html

于 2010-05-04T15:37:25.077 回答
3

Big-endian 和 little-endian 是描述字节序列在计算机内存中存储顺序的术语。

  1. Big-endian 是“大端”(序列中最重要的值)首先存储(在最低存储地址)的顺序。
  2. 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).

于 2015-02-18T06:01:18.340 回答
1

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

于 2009-03-31T15:45:41.470 回答