目录
一、字节序
1.字节序概念
字节序:内存中存储多字节数据的顺序。
难道存储数据还要看顺序吗?
yes。内存是按照字节编址与存取的,每个字节都有自己的地址。在存取单字节数据时不需要考虑顺序,因为直接取一个字节就好了。
但存储多字节数据时需要考虑数据的存储顺序,因为不同的cpu架构的存储顺序不同,因此这里需要知道字节序的分类,以及每一类的特点。(数据存储时从低地址到高地址存储,数据读取时从低地址到高地址读取)
字节序分类:
- 大端模式(大端字节序):内存的低地址空间存储数据的高位,即低地址存高位。
- 小端模式(小端字节序):内存的低地址空间存储数据的低位,即低地址存低位。
2.字节序的理解
比如这里有一个int 型整数 1,int型占据4个字节(也就是32个比特位)大小的内存空间,它的二进制形式是:
- 0000 0000 0000 0000 0000 0000 0000 0001
它的十六进制形式是:
- 0x 00 00 00 01
如图所示是十六进制的表示形式,注意区分高位和低位。
(1)大端模式存储数据
在大端模式中整型1是如何存储的?(以32位为例)
(1)按照大端模式下低地址存高位,低地址会存储00,而这四个字节中的最高地址存储01。
(2)在系统读取这个整型数据时,就会一次性读取出4个字节,然后按照大端模式对数据进行解读,得到正确的数据序列。
(2)小端模式存储数据
小端模式中整型1是如何存储的?(以32位为例)
(1)按照小端模式低地址存低位,四字节的最低地址存储01,四字节的最高地址存储00。
(2)在系统读取这个整型时,就会一次性读取4个字节,按照小端模式解释数据,得到正确序列。
二、网络字节序
(1)网络通信就是两端主机之间进行数据传输,两端主机使用的字节序不一定是相同的,这样就会造成数据错乱的情况。
(2)如果是两台主机之间进行通信,主机A是大端模式,主机B是小端模式。主机A如果要发送一个整型变量1给主机B,发送数据时,数据肯定都是从低地址开始发送的,接收端存储接收的数据时,也是从低地址开始存储数据的。但这样就有了很严重的问题。
(3)看看主机A的发送顺序,从低地址到高地址开始发送:第一个字节发送00,第二个字节发送00,第三个字节发送00,第四个字节发送01。
(4)来看看主机B的接收和存储顺序,接受顺序就是主机A的发送顺序,存储时也是按地址从小到大存储的。主机B的低地址存储00,高位存01。
(5)在主机B读取数据时就会出错了,因为主机B是用低地址来存储低位的。主机B如果要读取这个数据,就会一次性读取出来4个字节,然后按照主机B的字节序进行数据解析(主机B是小端)。然后就出现问题了,按照小端模式对数据进行解析后,得到的数据是这样的:0x 01 00 00 00。完犊子了,直接从1变成了一个很大的数据,这意味着数据会出现二义性。
(6)上面这个过程如果用一个通俗的例子来说就是,主机A说的是汉语,结果主机B把汉语当成英语进行理解,那肯定会出错啊。
(7)这样的问题是很严重的,因此网络通信中,要求全都使用网络字节序,而网络字节序是大端字节序。