【问题标题】:Difference between Big Endian and little Endian Byte orderBig Endian 和 Little Endian 字节顺序的区别
【发布时间】:2010-10-16 15:24:50
【问题描述】:

Big Endian 和 Little Endian 字节顺序有什么区别?

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

【问题讨论】:

  • 不要忘记中端。它在 wiki 页面上。
  • @Mitch:几乎任何问题都可以这样说。
  • @Jon B:是的,它可以,但有些问题最好通过持续研究而不是一些专家给出的几个答案来回答。
  • @BALAMURUGAN:BigEndian 和 Little Endian 仅在存在多字节数据时出现。

标签: unicode utf-16 endianness


【解决方案1】:

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

  1. Big-endian 是“大端”(序列中最重要的值)首先存储(在最低存储地址)的顺序。
  2. Little-endian 是“小端”(序列中最不重要的值)首先存储的顺序。

例如

在大端计算机中,十六进制数4F52 所需的两个字节将在存储空间(if 4F is stored at storage address 1000, for example, 52 will be at address 1001). 中存储为4F52

在小端系统中,它将被存储为524F (52 at address 1000, 4F at 1001).

【讨论】:

    【解决方案2】:

    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 编码文本文件的前两个字节是 FEFF,则编码为 UTF-16BE。对于FFFE,是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 的维基百科页面。

    【讨论】:

    • 字节序永远是违反直觉的,因为 BE 将最高有效字节存储在最小地址中,而不是最后/结束地址。任何。这个网站说得很清楚,Big and Little Endian在大端中,你将最高有效字节存储在最小地址中。顺便说一句,Visual Example很有帮助。
    • 如果您愿意,可以更改单词以使其更有意义:[在大端中,您将最高有效字节存储在最小地址中。] 或 [在大端中,您将最低有效字节存储在最大地址中。] 同样的事情
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      little-endian: adj.

      描述了一种计算机体系结构,在该体系结构中,在给定的 16 位或 32 位字中,较低地址的字节具有较低的重要性(该字以“小端优先”的方式存储)。 PDP-11 和 VAX 系列计算机和 Intel 微处理器以及许多通信和网络硬件都是 little-endian。该术语有时用于描述字节以外的单位的顺序;最常见的是一个字节内的位。

      大端:adj.

      [常见的;摘自 Swift 的《格列佛游记》,来自 Danny Cohen 的著名论文 On Holy Wars and a Plea for Peace,USC/ISI IEN 137,1980 年 4 月 1 日]

      描述了一种计算机体系结构,在该体系结构中,在给定的多字节数字表示中,最高有效字节具有最低地址(该字存储为“大端优先”)。大多数处理器,包括 IBM 370 系列、PDP-10、摩托罗拉微处理器系列,以及大多数各种 RISC 设计都是大端的。大端字节序有时也称为网络序。

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 这个答案不正确。字节序与底层硬件架构有关
        • UTF-8 是一种可变长度编码,每个字符使用 1-6 个字节,因此不固定为此处所述的单个字节!
        • 仅出于完整性考虑 - UTF-8 需要 1 到 4 个字节。有效的 UTF-8 不能超过 4 个字节。
        • @Ferdinand:是的,自从您最初的更正以来,我已经意识到这一点。正如我所看到的那样,帖子已再次澄清……尽管我认为我在纠正自己的过程中有些困惑。 :P
        • unicode.org/faq/utf_bom.html 似乎同意,但如果我错了,请再次纠正我......
        【解决方案6】:

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

        Wikipedia有更完整的解释。

        【讨论】:

        • 这个答案不正确。字节序与底层硬件架构有关
        • 无论底层硬件如何,您都可以按任意字节顺序存储 UTF-16 编码文件。
        • 鉴于问题的上下文,这个答案是完全可以接受恕我直言
        • @joev:没错。它通常与硬件架构相关,但不一定如此。为了跨平台兼容性,Unicode 编码器/解码器因此应该能够使用任一字节顺序。
        猜你喜欢
        • 2022-12-12
        • 2012-10-09
        • 2019-06-30
        • 2018-05-15
        • 2020-12-01
        • 2018-08-09
        • 2022-06-10
        • 1970-01-01
        • 2019-03-13
        相关资源
        最近更新 更多