我有ip和netmask
192.168.1.0 255.255.255.0
我需要将网络掩码转换为cidr格式
192.168.1.0/24
如何将ipv4地址和网络掩码转换为cidr格式?
我使用的是PHP5.6
答案 0 :(得分:2)
复杂的方法是将网络掩码转换为二进制并计算前导1位的数量。但由于只有33个可能的值,更简单的方法只是一个关联数组:
$netmask_to_cidr = array(
'255.255.255.255' => 32,
'255.255.255.254' => 31,
'255.255.255.252' => 30,
...
'128.0.0.0' => 1,
'0.0.0.0' => 0);
答案 1 :(得分:0)
我修复了use Amazon Cognito to Get Credentials中0.0.0.0
掩码的代码,并对其进行了一些简化(无需总是计算$base = ip2long('255.255.255.255');
):
function mask2cidr($mask)
{
if($mask[0]=='0')
return 0;
return 32 - log(~ip2long($mask) + 1, 2);
}
@Barmar的回答也很好,因为它将始终完成此工作,而不会在任何PC架构上引起任何意外。
答案 2 :(得分:0)
以下代码将掩码转换为二进制,以将二进制转换为CIDR
public function mask2cdr($mask) {
$dq = explode(".",$mask);
for ($i=0; $i<4 ; $i++) {
$bin[$i]=str_pad(decbin($dq[$i]), 8, "0", STR_PAD_LEFT);
}
$bin = implode("",$bin);
return strlen(rtrim($bin,"0"));
}
答案 3 :(得分:-1)
有些话题,但可能会对其他人有所帮助,您可以在此处找到解决方案:
function mask2cidr($mask)
{
$long = ip2long($mask);
$base = ip2long('255.255.255.255');
return 32-log(($long ^ $base)+1,2);
/* xor-ing will give you the inverse mask,
log base 2 of that +1 will return the number
of bits that are off in the mask and subtracting
from 32 gets you the cidr notation */
}