大字节序和小字节序之间的差异

问题描述 投票:0回答:1

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

两者似乎都与Unicode和UTF16有关。我们到底在哪里使用呢?

c arrays pointers memory
1个回答
112
投票

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。

一个可视示例:单词“ Example”采用不同的编码(带有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的维基百科页面。


30
投票

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

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


7
投票

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

Wikipedia的解释更为完整。


4
投票

little-endian:adj。

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

big-endian:adj。

[common;摘自斯威夫特的《格列佛游记》,1980年4月1日,USC / ISI IEN 137着名的丹尼·科恩(Danny Cohen)着名的论文《圣战与和平》。]

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

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


2
投票

大端和小端是描述字节序列在计算机内存中存储顺序的术语。

  1. [Big-endian是先将“ big end”(序列中的最高有效值)存储(在最低存储地址处)的顺序。
  2. Little-endian是先存储“小端”(序列中的最低有效值)的顺序。

例如

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

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


1
投票
对于Unicode / UTF-16编码,需要指定

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

© www.soinside.com 2019 - 2024. All rights reserved.