一、概念
字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。
二、分类
字节序有两者常见序:
1. Big-Endian(大端):高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。如:TCP/IP协议字节序。
2.Little-Endian(小端):低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。如:X86系列CPU字节序。
网络字节序 = 大端字节序
三、高低地址与高低字节
高低地址
C程序映射中内存的空间布局大致如下:
最高内存地址 0xFFFFFFFF
栈区(从高内存地址,往 低内存地址发展。即栈底在高地址,栈顶在低地址)
堆区(从低内存地址 ,往 高内存地址发展)
全局区(常量和全局变量)
代码区
最低内存地址 0x00000000
高低字节
在十进制中靠左边的是高位,靠右边的是低位,在其他进制也是如此。例如 0x12345678,从高位到低位的字节依次是0x12、0x34、0x56和0x78。
网络字节序 就是 大端字节序:4个字节的32 bit值以下面的次序传输,首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit
主机字节序 就是 小端字节序,现代PC大多采用小端字节序。
四、例子
在内存中双字0x01020304的存储方式:内存地址是4000&4001&4002&4003
LE(小端):04 03 02 01 BE(大端):01 02 03 04
五、字节序转换API
为使网络程序具有可移植性,使同样的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);
//h表示host,n表示network,l表示32位长整数(4个字节),s表示16位短整数(2个字节)。
//如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回,如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。