2016-05-31 3 views
0

"ip2long"PHP 메소드를 사용하여 ipv4의 서브넷 마스크에서 cidr을 계산할 수 있습니다. 어떻게 ipv6에 대해 동일한 계산을해야합니까? 내가 계산할 수계산 ipv6 cidr php

예를 들어

는 다음 : 내가 좋아하는 IPv6 주소에 대해 동일한을 계산하는 방법을

255.255.252.0 => /22 

은 :

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

내가 IPv6에 대한 같은 시도했을 때 내가 출력을 얻지 못했습니까?

참고 :이 CIDR 표기법을 사용하여 IP 주소를 계산하지 않습니다. ipv6의 서브넷 마스크를 관련 네트워킹 비트로 변환하려고합니다.

+2

의 가능한 복제 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

[CIDR 프리픽스로부터 계산 PHP5 IPv6의 범위? (