1. 大小端概念
大端:数据的高字节保存在低地址空间,低字节保存在高地址空间
小端:数据的高字节保存在高地址空间,低字节保存在低地址空间
2. 为什么会有大小端
在计算机中,以字节为单位进行存储数据,一个字节占8位。
(1) 数据除了8位的char类型,还有16位的short,32位的int、long等
(2) 对于大于8位的CPU,如32位CPU,寄存器超过一个字节
由于以上两点原因,所以存在对于多个字节的数据如何进行排放问题,也就存在大端小端。
3. 大小端数据存放举例
对于16位的数据0x1122,高字节数据为11,低字节数据为22.
低地址空间 | 高地址空间 | |
大端 | 11 | 22 |
小端 | 22 | 11 |
4. 如何测试编译器是大端还是小端
#include<stdio.h>
int main()
{
short int x;
char x0,x1;
x=0x1122;
x0=((char*)&x)[0]; //低地址单元
x1=((char*)&x)[1]; //高地址单元
printf("x0=0x%x,x1=0x%x",x0,x1);// 若x0=0x11,则是大端; 若x0=0x22,则是小端
return 0;
}
5. 主机字节序和网络字节序
不同平台上主机字节序不同,可能为大端也可能为小端。在80x86平台上使用小端序列,即低字节保存在低地址位,高字节保存在高地址位。
那么网络字节序采用哪种方式呢?网络数据流以字节流的形式传输,在接收端,当收到数据后,将收到的第一个字节保存在高位;而发送端所发送的第一个字节为内存低地址空间数据。因此,在发送多字节数据时,应该将数据以大端形式保存,即网络字节序为大端。
由于网络字节序统一为大端,而主机字节序不统一,因此,在网络数据传输前,需要对主机序列进行转换再传输,主机收到网络数据后同样需要将网络字节序转换为主机字节序。
主机字节序 -> 网络字节序:htons, htonl,分别将16位和32位的主机字节序转换为网络字节序。
网络字节序 -> 主机字节序:ntohs, ntohl,分别将16位和32位的网络字节序转换为主机字节序。