2016-05-31 9 views
0

"ip2long" phpメソッドを使用して、ipv4のサブネットマスクからcidrを計算できます。私はipv6のために同じものをどのように計算すべきですか?例えばipv6 cidr phpを計算する

私は次のように計算できます。

255.255.252.0 => /22 

私のようなIPv6のアドレスに同じを計算する必要がありますどのように私は、IPv6私のために同じことをしようとしたとき

ffff:ffff:ffff:ffff:: 
ffff:ffff:ffff:ffff:0:0:0:0 

出力はありませんでしたか?

注:このCIDR表記を使用してIPアドレスを計算していません。 ipv6のサブネットマスクを関連するネットワーキングビットに変換したいだけです。

+2

の可能性のある重複[CIDRプレフィックスからPHP5を計算IPv6の範囲?](http://stackoverflow.com/questions/10085266/php5-calculate-ipv6-range-from-cidr-prefix ) –

+0

@TomaszKowalczykここで範囲を計算していません。あなたが言った重複した質問には反対の解決策しかありません。 –

答えて

2
function ip6_mask2cidr($mask) { 
    $s = ''; 
    if (substr($mask, -1) == ':') $mask .= '0'; 
    if (substr($mask, 0, 1) == ':') $mask = '0' . $mask;  
    if (strpos($mask, '::') !== false) 
     $mask = str_replace('::', str_repeat(':0', 8 - substr_count($mask, ':')).':', $mask); 

    foreach(explode(':',$mask) as $oct) { 
     // The following two lines, perhaps, superfluous. 
     // I left them because of the paranoia :) 
     $oct = trim($oct); 
     if ($oct == '') $s .= '0000000000000000'; 
     else $s .= str_pad(base_convert($oct, 16, 2), 16, '0', STR_PAD_LEFT); 
    } 
    return strlen($s) - strlen(rtrim($s, '0')); 
} 

echo ip6_mask2cidr('ffff:ffff:ffff:ffff::') . "\n"; // 64 

demo