是否有Perl函数,给定IP地址和子网掩码,可以返回IP所属子网的CIDR表示法?
例如,假设我的IP 192.168.1.23
包含子网掩码255.255.255.0
,我想获取值192.168.1.0/24
。
或者如果我192.168.1.23
有子网掩码255.255.255.224
,我想要192.168.1.0/27
,依此类推。
我最终可以建立一个这样做的功能,但我很难相信没有这样做的东西。
答案 0 :(得分:6)
我建议您使用NetAddr::IP
模块。使用所需的IP地址和网络掩码构建对象并在其上调用network
方法是一件简单的事情
看起来像这样
use strict;
use warnings 'all';
use feature 'say';
use NetAddr::IP;
say make_cidr(qw/ 192.168.1.23 255.255.255.0 /);
say make_cidr(qw/ 192.168.1.23 255.255.255.224 /);
sub make_cidr {
my ($addr, $mask) = @_;
my $net = NetAddr::IP->new($addr, $mask);
$net->network;
}
192.168.1.0/24
192.168.1.0/27
答案 1 :(得分:4)
如果您需要预先打包的解决方案,可以使用Net::CIDR中的addrandmask2cidr
功能。
如果你想自己滚动,基本的算法是计算掩码中的设置位数以获得斜杠后的值(例如,255.255.255.0是11111111.11111111.11111111.00000000二进制,24位设置,因此CIDR / 24)并使用掩码执行地址的逻辑和(&
)以获取网络的基址。