linux下将整型IPv4地址转换成点分十进制字符串的方法

本文介绍了一种在Linux环境下打印点分十进制IP地址的方法,使用NIPQUAD和NIPQUAD_FMT宏实现,并提供了测试代码示例。此外,还提到了内核中特有的IP地址打印格式%pI4。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天看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).

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

转载于:https://www.cnblogs.com/tonybuaa/archive/2013/05/02/3053939.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值