= 0; $pos--) { //current position represents floor($int / ($base64charsLength ^ $pos)) $base = 1; for($i = 0; $i < $pos; $i++) { $base = $base * self::$base64charsLength; } $posValue = floor($int / $base); //get the char representing $posValue $posChar = self::$base64chars[$posValue]; $numeric .= $posChar; } return $numeric; } public static function numToInt($numeric) { $base = 1; $int = 0; for($pos = strlen($numeric)-1; $pos >= 0; $pos--) { $posValue = array_search($numeric[$pos], self::$base64chars); $int = ($posValue * $base); $base = $base * self::$base64charsLength; } //fix a small "bug": normaly 0 = AAAAA but we need 1 = AAAAA $int = $int + 1; return $int; } public static function parseIP($numeric) { if(strlen($numeric) == 6) { //IPv4 $value = self::numToInt($numeric); $ip = array(); $ip[0] = ($value & 0xff000000) >> 24; $ip[1] = ($value & 0x00ff0000) >> 16; $ip[2] = ($value & 0x0000ff00) >> 8; $ip[3] = ($value & 0x000000ff); return implode(".", $ip); } else { //IPv6 $ip = array(); for($i = 0; $i < strlen($numeric);) { if($numeric[$i] == "_") { $rightBlocks = (strlen($numeric) - ($i + 1)) / 3; $skipCount = 8 - count($ip) - $rightBlocks; for($j = 0; $j < $skipBlocks; $j++) { $ip[] = "0"; } } else { $value = self::numToInt($numeric[$i].$numeric[$i+1].$numeric[$i+2]); $ip[] = dechex($value); $i += 3; } } return implode(":", $ip); } } } ?>