本节主要讲字节序(Byte Ordering)或者说数据存储优先顺序。
大端(big-endian),小端(little-endian)
大端字节序与小端字节序
(有的地方叫大端存储与小端存储)
下面以整数1为例来说明
16位整型数1的小端字节序
第2个字节 第1个字节
0000 0000 0000 0001
MSB LSB
十六进制表示:0x0001
MSB:Most Significant Byte 最高有效字节
LSB:Least Significant Byte 最低有效字节
16位整型数1的大端字节序
第2个字节 第1个字节
0000 0001 0000 0000
MSB LSB
十六进制表示:0x0100
十进制表示:256
32位整型数1的小端字节序
第4个字节 第3个字节 第2个字节 第1个字节
0000 0000 0000 0000 0000 0000 0000 0001
MSB LSB
十六进制表示:0x00000001
32位整型数1的大端字节序
第1个字节 第2个字节 第3个字节 第4个字节
0000 0001 0000 0000 0000 0000 0000 0000
MSB LSB
十进制表示:16777216
主机字节序与网络字节序
主机字节序,对于不同的处理器,可以采用不同的大小端字节序,我这里的主机字节序是采用小端字节序存储的。
网络字节序,TCP/IP协议栈规定用大端字节序。
对于TCP/IP应用程序,有下面四个用来在处理字节序和网络字节序之间实施转换的函数。
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong); 返回值:以网络字节序表示的32位整数
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong); 返回值:以主机字节序表示的32位整数
uint16_t ntohs(uint16_t netshort);
h --- host --- 主机字节序;
n --- net --- 网络字节序;
l --- long --- 长(4字节)整数
s --- short --- 短(2字节)整数
代码示例
#include <stdio.h>
#include <arpa/inet.h>
void main()
{
uint32_t net_long = htonl(1);
printf("net_long = %X\n", net_long);
uint16_t net_short = htons(1);
printf("net_short = %X\n", net_short);
uint32_t host_long = ntohl(net_long);
printf("host_long = %X\n", host_long);
uint16_t host_short = ntohs(net_short);
printf("host_short = %X\n", host_short);
}
执行结果如下:
net_long = 1000000
net_short = 100
host_long = 1
host_short = 1