CPU的字节序是指整数在内存中保存的顺序,称为主机序。

  1. 小端: 低地址位存储值的低位,高地址位存储值的高位。
  2. 大端: 低地址位存储值的高位,高地址位存储值的低位。

数字0x12345678在两种不同字节序CPU中存储顺序如下图所示:

所有网络协议都是采用大端的方式来传输数据的,所以大端方式又称为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前必须经过字节序的转换成为网络字节序后再进行传输。

一、存储中的大端与小端

摘抄《ARM体系结构与编程》

二、存储中的大端与小端和网络中的大小端

摘抄《UNIX网络编程卷1:套接字联网API (第三版)》

对于一个由2个字节组成的16位整数,在内存中存储这两个字节有两种方法:一种是将低序字节存储在起始地址,这称为小端(little-endian)字节序;另一种方法是将高序字节存储在起始地址,这称为大端(big-endian)字节序。

在图3-9中,顶部表明内存地址增长方向从右到左,在底部标明内存地址增长的方向为从左到右。并且还标明最高有效位(most significant bit,MSB)是这个16位值最左边一位,最低有效位(least significant bit, LSB)是这个16位值最右边一位。

术语“小端”和“大端”表示多个字节值的哪一端(小端或大端)存储在该值的起始地址。

  这两种字节序没有标准可循,都有系统在使用。把某个给定系统所用的字节序称为主机字节序,可以用以下程序输出主机字节序。方法是在一个短整数变量中存放2字节的值0x0102,然后查看它的连续字节c[0](对应上图地址A)和c1,以此确定字节序。

三、网络中的大小端

摘抄自《 TCP/IP详解 卷1:协议》

网络上传输的数据都是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它将这个字节作为高位字节还是低位字节处理,是一个比较有意义的问题:

UDP/TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,这就要求发送端发送的第一个字节是高位字节;而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节

所以:网络字节序就是大端字节序, 有些系统的本机字节序是小端字节序, 有些则是大端字节序, 为了保证传送顺序的一致性, 所以网际协议使用大端字节序来传送数据。

作者:joker.liu  创建时间:2022-11-03 11:29
最后编辑:joker.liu  更新时间:2023-04-23 14:41