看下面一段程序:
#include <stdio.h> #include <arpa/inet.h> int main(int argc, char* argv[]) { struct in_addr m; //2237180096 m.s_addr=0x8558a8c0; //133 88 168 192 printf("%u\n", m.s_addr ); printf("%s\n", inet_ntoa(m)); unsigned short t=0x0908; //2312 printf("%hu\n",t); unsigned short s=ntohs(t); printf("%hu\n",s); return 0; }
输出结果:
首先s_addr是unsigned int类型,使用inet_ntoa转换时先判断本机的字节序位网络字节序(假如本地字节序是大端存储,就不用转),就是0x8558a8c0修改成0xc0a85885,每一个字节对应ipv4的一个段,如下:
c0 a8 58 85
192 168 88 133
ntohs不检查参数的字节序,只检查本地字节序是否和网络字节序一致。
ntohs()函数会先判断本地字节序,如果是小端存储(和大端字节序相反),就进行转换;如果是大端字节序就不进行转换。