考虑一个16位整数,它由2个字节组成。内存存储这两个字节的方法有两种:一种是将低序字节存储在起始地址,这叫做小端(little-endian)字节序;另外一种方法是将高序字节存储在起始地址,这成为大端(big-endian)字节序;
也就是说2个字节或以上的数据,需要考虑大小端问题。1个字节的不需要考虑.......
图中显示,16位值,8位低字节序保存在起始地址的是小端字节序;8位高序字节保存在其实地址的大端字节序;
主机序和网络序的转换:
网络协议都使用大端字节序,也就是高序字节存储在起始地址,但主机不确定是大端还是小端。所以我们在将16位及以上的数据发送到网络中时,需要进行字节序的转换:
--------统统转成大端序!!!
转换函数:<netinet.h>
l uint16_t htons(uint16_t host16bitvalue);
l uint32_t htonl(uint32_t host32bitvalue);
l uint16_t ntohs(uint16_t net16bitvalue);
l uint32_t ntohl(uint32_t net32bitvalue);
记忆方法:
h-host;n-network;s-short(16位,例如TCP或UDP端口号);l-long(32位,如IPv4地址);