1.字节序

字节序是处理器架构特性,用于指示像整数这样的大数据类型内部的字节如何排序。

简单来说,就是指超过一个字节的数据类型在内存中的存储的顺序。

那么很明显,像char这样的类型,肯定不存在字节序的问题了。

不同类型的处理器采用的字节序可能不同。

2.大小端

大端字节序(big-endian):高位字节数据存放在低地址处,低位数据存放在高地址处;

小端字节序(little-endian):高位字节数据存放在高地址处,低位数据存放在低地址处。

3.网络字序与主机字序

前面说的字节序其实是指主机字节序,即主机字节序既包括小端字节序,又包括大端字节序。它与具体的CPU类型、操作系统类型等有关,就像前面的表格列出的。

网络字节序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而保证数据在不同主机之间传输时能够被正确解释。

网络字节序采用大端字节序。
4.转换

Linux socket网络编程中,经常会使用下面四个C标准库函数进行字节序间的转换。

#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong); //将一个无符号长整型数从主机字节序转换成网络字节序
uint16_t htons(uint16_t hostshort); //将一个无符号短整型数从主机字节序转换成网络字节序
uint32_t ntohl(uint32_t netlong); //将一个无符号长整型数从网络字节序转换成主机字节序
uint16_t ntohs(uint16_t netshort); //将一个无符号短整型数从网络字节序转换成主机字节序

n代表“network”---网络,h代表“host”---主机,l代表long的长度(32位),s代表short的长度(16位)
在使用小端字节序的系统中,也就是主机字节序和网络字节序不同,所以这些函数会把字节序进行转换
在使用大端字节序的系统中,也就是主机字节序和网络字节序相同,不需要转换,这些函数会定义成空宏