一、什么是字节序
字节序(Byte Order)是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。其有两种存储方式:大端(Big-endian)和小端(Little-endian)。
二、端的起源
“endian” 这个词出自 Jonathan Swift 在1726 年写的讽刺小说《格列佛游记》(Gulliver’s Travels)。小人国的内战源于吃水煮鸡蛋时究竟是从大头(Big-endian)敲开还是从小头(Little-endian)敲开,由此曾发生过6次叛乱,其中一个皇帝送了命,另一个丢了王位。
三、如何理解
这里先来定义两个概念:
- MSB(Most Significant Bit/Byte):最重要的位或字节。它通常用来表明在一个 bit 序列(如一个 byte 是8个 bit 组成的一个序列)或一个 byte 序列(如一个汉字是两个 byte 组成的一个序列)中对整个序列取值影响最大的那个 bit/byte。(即最高位字节)
- LSB(Little Significant Bit/Byte):最不重要的位或字节。它通常用来表明在一个 bit 序列(如一个 byte 是8个 bit 组成的一个序列)或一个 byte 序列(如一个汉字是两个 byte 组成的一个序列)中对整个序列取值影响最小的那个 bit/byte。(即最低位字节)
比如一个十六进制的整数 0x12345678 里面:
| 0x12 | 0x34 | 0x56 | 0x78 |
|---|
0x12 就是 MSB,0x78 就是 LSB。而对于 0x78 这个字节而言,它的二进制是 01111000,那么最左边那个 0 就是 MSB,最右边那个 0 就是 LSB。
大端 和 小端 区别:
- 大端(Big-endian):规定 MSB 在存储时放在低地址,在传输时放在流的开始;LSB 在存储时放在高地址,在传输时放在流的末尾。(即高位字节在前,低位字节在后。)
- 小端(Little-endian):规定 MSB 在存储时放在高地址,在传输时放在流的末尾;LSB 在存储时放在低地址,在传输时放在流的开始。(即低位字节在前,高位字节在后。)
例如: 0x12345678 在不同机器中的存储是不同的,如下所示。
| 大端(Big-endian) | 小端(Little-endian) | |
|---|---|---|
| 0 字节 | 0x12 | 0x78 |
| 1 字节 | 0x34 | 0x56 |
| 2 字节 | 0x56 | 0x34 |
| 3 字节 | 0x78 | 0x12 |
四、为何不统一使用一种字节序
- 计算机电路先处理低位字节,效率比较高。因为计算就是从低位开始的,所以计算机内部很多都是小端字节序。
- 格式规范是为人类编写的,大端字节序更符合人类习惯。
五、常见应用场景
处理器:
- x86、MOS Technology 6502、Z80、VAX、PDP-11等处理器为小端序;
- Motorola 6800、Motorola 68000、PowerPC 970、System/370、SPARC(除V9外)等处理器为大端序;
- ARM、PowerPC(除PowerPC 970外)、DEC Alpha、SPARC V9、MIPS、PA-RISC及IA64的字节序是可配置的。
网络传输:
- 网络传输一般采用大端序,也被称之为网络字节序,或网络序。IP协议中定义大端序为网络字节序。