ip주소를 정수로 아니면 정수를 ip주소로 바꿔주는 소스입니다. 며칠 전에 포스팅한 DNS A 레코드를 체크하는 소스를 공개했는데, 그 소스의 일부를 떼어내었습니다.

사용법은 다음 표를 참고하시구요. ipv4, ipv6, 정수 를 사용할 수 있으며 php 4, php5 공용입니다.

 

<?php
// 정수를 ip 주소로...

// 4294967290는 255.255.255.250임

if($ip = long2_ip(4294967290))

    echo $ip;

}
else
{
    echo 
"에러"
;
}


// ipv4 주소를 정수로...
if($ip = ip2_long("255.255.255.250"))

    echo $ip
;
}
else
{
    echo 
"에러"
;
}

// ipv6 주소를 정수로...
if($ip = ip2_long("ffff::1"))
{
    echo 
$ip
;
}
else
{
    echo 
"error"
;
}



/*
*************************   ip를 정수로...   *************************
*/
function ip2_long($ip
)
{
    if(
is_ipv6($ip) === false
)
    {
        
$ip sprintf("%u",ip2long($ip
));
        if((
$ip 0) || ($ip 4294967295
))
        {
            return 
false
;
        }
        return 
$ip
;
    }
    else
    {
        
$resource inet_pton6($ip
);
        
$i 15
;
        while(
$i >= 0
)
        {
            
$integerip sprintf("%08b",(ord($resource[$i
])));
            
$resourceip $integerip.$resourceip
;
            
$i
--;
        }
        return 
gmp_strval(gmp_init($resourceip,2),10
); 
    }
}

/*
*************************   정수를 ip로...   *************************
*/
function long2_ip($ip
)
{
    if(
$ip 4294967295
)
    {
        return 
long2ip($ip
);
    }
    else
    {
        
$resource gmp_strval(gmp_init($ip,10),2
);
        
$resourcelen strlen($resource
);
        if(
$resourcelen 128
)
        {
            
$pad 128 $resourcelen
;
            for(
$i=1$i<=$pad$i
++)
            {
                
$resource '0'.$resource
;
            }
        }
        
$i 0
;
        while(
$i <= 7
)
        {
            
$resourceip .= dechex(bindec(substr($resource,($i*16),16))).":"
;
            
$i
++;
        }
        return 
inet_ntop6(inet_pton6(substr($resourceip,0,-1
)));
    }
}

/*
*************************   inet_pton   *************************
*/
function inet_pton6($ip
)
{
    if(
function_exists('inet_pton'
))
    {
        return 
inet_pton($ip
);
    }
    else
    {
        
$extract explode(":"$ip
);
        
$resource str_pad('', (4*(8-count($extract))), '0000'STR_PAD_LEFT
);
        foreach (
$extract as $val
)
        {
            
$resource .= str_pad($val4'0'STR_PAD_LEFT
);
        }
        return 
pack('H'.strlen($resource), $resource
);
    }
}

/*
*************************   inet_ntop   *************************
*/
function inet_ntop6($ip

{
    if(
function_exists('inet_ntop'
))
    {
        return 
inet_ntop($ip
);
    }
    else
    {
        
$extract explode(':',substr(chunk_split(bin2hex($ip),4,':'),0,-1
));
        foreach(
$extract as $val
)
        {
            while(
$val{0} == '0'
)
            {
                
$val substr($val,1
);
            }
            if(
$val != ''
)
            {
                if(
$resource != ''
)
                {
                    
$resource .= ':'
;
                }
                
$resource .= $val
;
            }
            else
            {
                if(
strpos($resource,'::') === false
)
                {
                    if(
substr($resource,-1) == ':'
)
                    {
                        continue;
                    }
                    
$resource .= ':'
;
                    continue;
                }
                if(
$resource != ''
)
                {
                    
$resource .= ':'
;
                }
                
$resource .= '0'
;
            }
        }
    }
    return 
$resource
;
}

 

/*
*************************   ipv6, ipv4   *************************
*/
function is_ipv6($ip
{
    if(!
preg_match("/^([0-9a-f\.\/:]+)$/",strtolower($ip
))) 
    { 
        return 
false

    } 

    if(
substr_count($ip,":") < 2

    { 
        return 
false

    } 

    
$part preg_split("/[:\/]/"$ip
); 
    foreach(
$part as $i

    {
        if(
strlen($i) > 4

        {
            return 
false
;
        }
    }
    return 
true
;
}

?>

관련글: 2013/02/15 - [phP 함수 레퍼런스/서버 함수] - DNS A 레코드 체크하는 소스