1、什么是字节序
计算机在储存数据时有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)
1.大端字节序(big endian)
大端字节序(big endian)是将值的高位存储在较小的地址,值的低位存储在较大的地址
2.小端字节序(little endian)
小端字节序(little endian)是将值的低位存储在较小的地址,值的高位存储在较大的地址
2、网络字节序和主机字节序
顾名思义,网络字节序是数据在网上交换时的信息存储方式,而主机字节序是数据在本地进行存储的方式
1.网络字节序
数据在网上传输,如果存储方式不同,那么大家交流数据会比较麻烦,所以TCP/IP协议规定,网上传输采用大端字节序(big endian)统一数据传输规范
2.主机字节序
存储在本地计算机上的数据存储方式是由CPU决定的,不同的CPU会有不同的存储方式,比如x86系列CPU都是little-endian的字节序,
3、计算机处理字节序的方法
计算机在处理数据时不知道大端小端,只会按照自己顺序读取,所以,如果是大端字节序,那么顺序读取第一个就是高位字节,如果是小端字节序,顺序读取第一位就是低位字节
4、网络字节序和主机字节序的转换
两台计算机之间传输数据需要通过网络字节序传输,那么从A计算机到B计算机之间,需要有一个标准化的过程,
1.网络字节序转主机字节序
uint32_t ntohl(uint32_t netlong); //将一个无符号长整型数从网络字节序转换成主机字节序 uint16_t ntohs(uint16_t netshort); //将一个无符号短整型数从网络字节序转换成主机字节序
2.主机字节序转网络字节序
uint32_t htonl(uint32_t hostlong); //将一个无符号长整型数从主机字节序转换成网络字节序 uint16_t htons(uint16_t hostshort); //将一个无符号短整型数从主机字节序转换成网络字节序
- n代表“network”---网络,h代表“host”---主机,l代表long的长度(32位),s代表short的长度(16位)
- 在使用小端字节序的系统中,也就是主机字节序和网络字节序不同,所以这些函数会把字节序进行转换
- 在使用大端字节序的系统中,也就是主机字节序和网络字节序相同,不需要转换,这些函数会定义成空宏