将ipv4 netmask转换为cidr格式

时间:2016-01-29 02:21:18

标签: php networking ip ipv4 cidr

我有ip和netmask

192.168.1.0 255.255.255.0

我需要将网络掩码转换为cidr格式

192.168.1.0/24

如何将ipv4地址和网络掩码转换为cidr格式?

我使用的是PHP5.6

4 个答案:

答案 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 Credentials0.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 */
}

PHP ip2long help