<html>
    <head>
        <title>CIDR calculation tool</title>
    </head>
    <body>
    <?php
    
function expand_ip($ip) {
        
$ip trim($ip,'[].');

        if (
strpos($ip':') === false) {
            
$c substr_count($ip'.');
            if (
$c <= 3) {
                
$ip .= str_repeat('.0',3-$c);
            } else {
                
$ip '';
            }
            return 
$ip//ipv4
        
}

        if (
substr_count($ip'::') > 1) { 
            return 
'';
        }

        
$ip str_replace('::'str_repeat(':0'substr_count($ip':')) . ':'$ip) ;

        if (
$ip[0] === ':') {
            
$ip '0'.$ip;
        }
        if(
substr($ip,-1,1) === ':') {
            
$ip .= '0';
        }
        
$r_ip '';
        foreach(
explode(':'$ip) as $group) {
            if (
hexdec($group) > 0xffff) return '';
            
$r_ip .= str_pad($group4'0'STR_PAD_LEFT).':';
        }
        return 
trim($r_ip':');
    }

    function 
shorten_ipv6($ip) {
        
$ip expand_ip($ip); // soyons certain que l'ip n'est pas dirty.

        
if (strpos($ip':') === false) {
            return 
$ip//ipv4
        
}
        
        
$n_ip = array();
        foreach(
explode(':'$ip) as $group) {
            
$group ltrim($group'0');
            
$n_ip[] = $group == '' '0' $group;
        }
        
$ip ':'.implode(':'$n_ip).':';
        
        for(
$i 8$i != 1; --$i) {
            
$ip str_replace(str_repeat(':0',$i).':' '::'$ip$count);
            if (
$count) break;
        }

        if (
$ip[0] === ':' && $ip[1] !== ':'$ip substr($ip,1);
        if (
substr($ip, -11) === ':' && substr($ip, -21) !== ':'$ip substr($ip,0,-1);

        return 
$ip;
    }


    function 
bin2ip($ip) {
        
$r_ip '';
        switch (
strlen($ip)) {
            case 
128:
                foreach(
str_split($ip16) as $group) {
                    
$r_ip .= str_pad(base_convert($group216), 4'0'STR_PAD_LEFT).':';
                }
                break;
                
            case 
32:
                foreach(
str_split($ip8) as $group) {
                    
$r_ip .= base_convert($group210).'.';
                }
                break;
                
            default:
        }
        return 
trim($r_ip':.');
    }

    function 
ip2bin($ip) {
        
$ip str_replace(':''.'expand_ip($ip));
        
$groups explode('.'$ip);
        
$r_ip '';
        
        switch (
count($groups)) {
            case 
8:
                foreach(
$groups as $group) {
                    
$r_ip .= str_pad(base_convert($group162), 16'0'STR_PAD_LEFT);
                }
                break;
                
            case 
4:
                foreach(
$groups as $group) {
                    
$r_ip .= str_pad(base_convert($group102), 8'0'STR_PAD_LEFT);
                }
                break;
                
            default:
        }
        return 
$r_ip;
    }

    function 
netmask($cidr$bits 32) {
        if (
$cidr $bits) {
            return 
false;
        }
        return 
str_pad(str_repeat('1'$cidr) , $bits'0'STR_PAD_RIGHT);
    }

    
/* ---------------------- */

    
$ip   = @$_GET['ip'] ? : '0.0.0.0';
    
$cidr = @$_GET['cidr'] ? : 1;
    if (
strpos($ip'/') !== false) list($ip$cidr) = explode('/'$ip2);

    if (
preg_match('/^([0-1]{128}|[0-1]{32})$/s'$ip)) { //binary, baby
        
$ip bin2ip($ip);
    }
    if (
preg_match('/[a-zA-Z]/'$ip)) {
        
$ip gethostbyname ($ip);
    }

    
$b_ip ip2bin($ip);
    
$bits strlen($b_ip);

    echo 
'<form>IPv4 or IPv6: <input name="ip" value="'.$ip.'" /> <strong>/</strong> <select name="cidr">';
    for(
$i 1;$i <= 128; ++$i) echo '<option value="'.$i.'"'.($i == $cidr 'selected':'').'>'.$i.'&nbsp;&nbsp;['.($bits == 32 'ipv4':'ipv6').': '.bcpow(2$bits-$i).']</option>';
    echo 
'</select><input type="submit" value="go" /><br /></form><pre>';
    echo 
'<!--info-->';
    if (
$bits $cidr) die ('Cidr plus long que le ip ou ip invalide');
    
$ip_start bin2ip(str_pad(substr($b_ip0$cidr) , $bits'0'STR_PAD_RIGHT));
    
$ip_end   bin2ip(str_pad(substr($b_ip0$cidr) , $bits'1'STR_PAD_RIGHT));

    echo 
'Correct IP: '.expand_ip($ip)."\n";
    echo 
'Short IP (if applicable): '.shorten_ipv6($ip)."\n";
    echo 
'Integer: '.base_convert($b_ip,2,10)."\n";
    echo 
'Binary: '.$b_ip."\n";
    echo 
'Version: '.($bits==32?'4':'6')."\n";
    echo 
'Netmask: '.bin2ip(netmask($cidr$bits))."\n";
    echo 
'Ip start: '.$ip_start."\n";
    echo 
'Ip end:   '.$ip_end."\n";
    echo 
'Total subnets:   '.bcpow(2$bits-$cidr)."\n";
    echo 
'Cidr block: '.shorten_ipv6($ip_start)."/{$cidr}\n";
    echo 
'</pre>';
    
?>
    </body>
</html>