zoukankan      html  css  js  c++  java
  • linux下将整型IPv4地址转换成点分十进制字符串的方法

    今天看netfilter的源码,发现一个打印点分十进制的好方法:使用NIPQUAD和NIPQUAD_FMT宏:

    #define NIPQUAD_FMT "%u.%u.%u.%u"
    #define NIPQUAD(addr) \
     ((unsigned char *)&addr)[0], \
     ((unsigned char *)&addr)[1], \
     ((unsigned char *)&addr)[2], \
     ((unsigned char *)&addr)[3]

    写个测试代码:

    #include <stdio.h>
    
    #define NIPQUAD_FMT "%u.%u.%u.%u"
    #define NIPQUAD(addr) \
     ((unsigned char *)&addr)[0], \
     ((unsigned char *)&addr)[1], \
     ((unsigned char *)&addr)[2], \
     ((unsigned char *)&addr)[3]
    
    
    int main() {
        unsigned int ip;
        ip = htonl(3232235777);
        printf("ip = " NIPQUAD_FMT "\n", NIPQUAD(ip));
    }

    输出结果:

    tony@ubuntu-a:~/code$ ./a.out 
    ip = 192.168.1.1

    这个用法要注意的就是,NIPQUAD的参数需要是网络序的,所以事先用htonl转一下就可以了。

    另外还看到一种用法,就是使用%pI4打印地址:

    sprintf(buffer, "%pI4", &ip);

    网上是这样说的:

    The kernel's family of printf() functions has a special format specifier for IP-addresses (%pI4 for IPv4-addresses, %pI6 for IPv6).

    也就是说这种格式仅供内核来使用,一般用户程序是不能用的。

  • 相关阅读:
    常见面试题
    3*0.1 == 0.3 将会返回什么?true 还是 false?
    poj_2186 强连通分支
    强连通分量、割点、桥
    最小生成树
    poj_2349 Kruskal 最小生成树
    poj_1258 prim最小生成树
    最短路径
    poj_1125 Floyd最短路
    poj_1860 SPFA
  • 原文地址:https://www.cnblogs.com/tonybuaa/p/3053939.html
Copyright © 2011-2022 走看看