字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。常见的主要有以下2种:
小端序(Little-Endian):低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端。最符合人的思维的字节序,地址低位存储值的低位,地址高位存储值的高位。该序因为从人的第一观感来说低位值小,就应该放在内存地址小的地方,也即内存地址低位,反之,高位值就应该放在内存地址大的地方,也即内存地址高位。在80X86平台上,系统将多字节中的低位存储在变量起始地址,使用小端法。
大端序(Big-Endian):高位字节排放在内存的低地址端即该值的起始地址,低位字节排放在内存的高地址端。最直观的字节序,地址低位存储值的高位,地址高位存储值的低位。该序不需考虑对应关系,只需要把内存地址从左到右按照由低到高的顺序写出把值按照通常的高位到低位的顺序写出,两者对照,一个字节一个字节的填充进去。
常见的还一种是网络序,即网络字节顺序,它是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释,网络字节顺序采用big endian排序方式。
在C语言中,为了进行转换,socket库中提供了转换函数,包括下面四个:
htons:把unsigned short类型从主机序转换到网络序
htonl:把unsigned long类型从主机序转换到网络序
ntohs:把unsigned short类型从网络序转换到主机序
ntohl:把unsigned long