字节序

一、什么是字节序

字节序(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

四、为何不统一使用一种字节序

  • 计算机电路先处理低位字节,效率比较高。因为计算就是从低位开始的,所以计算机内部很多都是小端字节序。
  • 格式规范是为人类编写的,大端字节序更符合人类习惯。

五、常见应用场景

处理器:

网络传输:

  • 网络传输一般采用大端序,也被称之为网络字节序,或网络序IP协议中定义大端序为网络字节序。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容