конвертировать маску ipv4 в формат cidr

У меня есть ip и сетевая маска

192.168.1.0 255.255.255.0

Мне нужно преобразовать маску сети в формат CIDR

192.168.1.0/24

Как мне конвертировать адрес ipv4 и маску сети в формат cidr?

Я использую PHP5.6

0

Решение

Сложным способом было бы преобразовать маску сети в двоичную и посчитать количество старших 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

Другие решения

Немного подержите тему, но может помочь кто-то другой и у вас есть здесь решение:

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

0