字节排序问题

考虑一个16位整数,它由2个字节组成。内存存储这两个字节的方法有两种:一种是将低序字节存储在起始地址,这叫做小端(little-endian)字节序;另外一种方法是将高序字节存储在起始地址,这成为大端(big-endian)字节序

clip_image002

也就是说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地址);

posted @ 2014-03-04 20:06  大卫酱_David  阅读(452)  评论(0编辑  收藏  举报