计算机只理解二进制。这意味着 0 和 1 构成了计算机使用的语言。
一位是 0 或 1 。8 位组成一个字节。从这些简单的部分,我们可以构建极其复杂的连接计算机系统来渲染视频、显示来自世界各地的文本并计算极其复杂的算法。
一些数据(一些英文字符,如 a、e、i、o 和 u)可以用一个字节表示,但有些数据需要多个字节来表示。
但是字节顺序是计算机如何读取和理解字节的基本部分。
什么是字节序?
不同的语言以不同的顺序阅读他们的文本。例如,英语从左到右阅读,而阿拉伯语从右到左阅读。
这正是计算机的字节序。
如果我的计算机从左到右读取字节,而您的计算机从右到左读取,那么当我们需要通信时就会出现问题。
字节序意味着计算机内存中的字节按一定顺序读取。
如果我们永远不需要共享信息,我们就不会有任何问题。每台计算机对于它们自己的数据都是内部一致的。只是互联网使我们能够共享比以往更多的数据,而且我们的数据并不总是以相同的顺序读取。
Endianness以两种方式表示Big-endian ( BE ) 和Little-endian ( LE )。
- BE先存储大端。当读取多个字节时,第一个字节(或最低的内存地址)是最大的 - 所以对于从左到右阅读的人来说最有意义。
- LE首先存储小端。当读取多个字节时,第一个字节(或最低的内存地址)是最小的 - 所以对于从右到左阅读的人来说最有意义。
如果上述内容没有意义,那没关系,让我们看一个例子。
字节顺序如何工作的示例
让我们取一个我们必须使用多个字节来表示的数字,并展示 它可以表示的大端和小端方式。
我们将采用一个需要三个字节才能以二进制表示的数字。
这可能稍微简化了它,但我希望它可以作为一个有用的视觉解释。
一个二进制示例,其中 big-endian 和 little-endian 数字按读取顺序排列。
开头的 0b 只是为了让读者知道它是二进制的。所以我们知道二进制 1100 和十进制数 1,100 之间的区别(一千,一百)。我还使用了颜色希望使它更清晰。
我只是想明确一点,位排序很好。位的顺序没有区别。但是字节的正确顺序是有区别的。我希望以上演示了一个字节内 0 和 1 的顺序不要改变。但是字节顺序确实发生了变化。
如果我们也只需要发送一个字节,就没有问题(没有多种方法可以只订购一件东西)。这只是一个多于一个字节的序列的问题。
最高有效字节 (MSbyte)
术语最高有效字节是描述字节顺序的常用方法,因此我想确保彻底涵盖它。
在我们开始解释bits和bytes之前, 让我们用十进制数来做。
如果我取十进制数 2,984,你可以改变什么数字来改变最小的数量?答案是个位数 4. 如果我把 4 改成 5,整数只会增加 1。
但是,假设您将最高位 2 更改在 2,984 中。它将显着改变数字并增加一千。
这与bytes和bits完全相同。
我们将保持最小位置的字节称为最低有效字节( LSbyte ),将保持最小位置的位称为最低有效位( LSbit )。
一个图表来说明包含最低位置编号的字节是最低有效字节。
保存最高有效位的字节称为最高有效字节( MSbyte ),保存最高有效位位置的位称为最高有效位( MSbit )。
现在知道了这个新定义,我们可以将BE和LE定义为:
- Big endian先存储数据MSbyte
- Little endian最后存储数据MSbyte
这什么时候会成为问题?
在一些不同的情况下,字节序必须是计算中的一个考虑因素。
例如,Unicode 字符(用于在您的手机、PC、电视等任何地方呈现字符的字符集!)必须传递一个特殊的字符字节序列 (U+FEFF BYTE ORDER MARK),称为Byte Order Mark或BOM。BOM有几个用途。
BOM使系统知道:
- 传入的流是 Unicode。
- 其中使用了 Unicode 字符编码。
- 传入流的字节序。
一些编程语言甚至希望您详细说明正在使用的字节顺序。因此,一个程序可以根据您的需要使用、发送和接收BE或LE中的数字。
为什么这首先是一个问题 ?
碰巧出现了不同的协议,然后不得不相互交互。BE是任何网络协议中的主导顺序,例如称为网络顺序。 另一方面,大多数 PC 都是little-endian的。
您可以在此处在线运行 C++ 代码片段,以查看您的机器是什么字节序(我的是little-endian)。
字节序在很大程度上不再对高级语言产生影响,并且抽象出我们不需要担心的特定实现细节。
它的另一部分是处理器决定它们是小端还是大端(或者可以同时处理两者 - 称为Bi-endian),因此消费者选择驱动了我们认为计算机系统中“正常”的部分内容。
结论
我希望这篇文章已经解释了字节序是什么,什么是大字节序和小字节序,并且你现在更清楚地理解了这些概念。