, Arpad Ray * @link http://php.net/inet_pton * @author Arpad Ray * @version $Revision: 1.4 $ * @since PHP 5.1.0 * @require PHP 4.2.0 (array_fill) */ function php_compat_inet_pton($address) { $r = ip2long($address); if ($r !== false && $r != -1) { return pack('N', $r); } $delim_count = substr_count($address, ':'); if ($delim_count < 1 || $delim_count > 7) { return false; } $r = explode(':', $address); $rcount = count($r); if (($doub = array_search('', $r, 1)) !== false) { $length = (!$doub || $doub == $rcount - 1 ? 2 : 1); array_splice($r, $doub, $length, array_fill(0, 8 + $length - $rcount, 0)); } $r = array_map('hexdec', $r); array_unshift($r, 'n*'); $r = call_user_func_array('pack', $r); return $r; } function php_compat_inet_ntop($in_addr){ switch (strlen($in_addr)) { case 4: list(,$r) = unpack('N', $in_addr); return long2ip($r); case 16: $r = substr(chunk_split(bin2hex($in_addr), 4, ':'), 0, -1); $r = preg_replace( array('/(?::?\b0+\b:?){2,}/', '/\b0+([^0])/e'), array('::', '(int)"$1"?"$1":"0$1"'), $r); return $r; } return false; } if (!function_exists('inet_ntop')) { function inet_ntop($in_addr) { return php_compat_inet_ntop($in_addr); } } if (!function_exists('inet_pton')) { function inet_pton($address) { return php_compat_inet_pton($address); } } // -- some other functions.. /** * Convert an IPv4 address to IPv6 * * @param string IP Address in dot notation (192.168.1.100) * @return string IPv6 formatted address or false if invalid input */ function IPv4To6($Ip) { static $Mask = '::ffff:'; // This tells IPv6 it has an IPv4 address $IPv6 = (strpos($Ip, '::') === 0); $IPv4 = (strpos($Ip, '.') > 0); if (!$IPv4 && !$IPv6) return false; if ($IPv6 && $IPv4) $Ip = substr($Ip, strrpos($Ip, ':')+1); // Strip IPv4 Compatibility notation elseif (!$IPv4) return $Ip; // Seems to be IPv6 already? $Ip = array_pad(explode('.', $Ip), 4, 0); if (count($Ip) > 4) return false; for ($i = 0; $i < 4; $i++) if ($Ip[$i] > 255) return false; $Part7 = base_convert(($Ip[0] * 256) + $Ip[1], 10, 16); $Part8 = base_convert(($Ip[2] * 256) + $Ip[3], 10, 16); return $Mask.$Part7.':'.$Part8; } /** * Convert IPv6 address to an integer * * Optionally split in to two parts. * * @see http://stackoverflow.com/questions/420680/ */ function IPv6ToLong($Ip, $DatabaseParts= 2) { $Ip = ExpandIPv6Notation($Ip); $Parts = explode(':', $Ip); $Ip = array('', ''); for ($i = 0; $i < 4; $i++) $Ip[0] .= str_pad(base_convert($Parts[$i], 16, 2), 16, 0, STR_PAD_LEFT); for ($i = 4; $i < 8; $i++) $Ip[1] .= str_pad(base_convert($Parts[$i], 16, 2), 16, 0, STR_PAD_LEFT); if ($DatabaseParts == 2) return array(base_convert($Ip[0], 2, 10), base_convert($Ip[1], 2, 10)); else return base_convert($Ip[0], 2, 10) + base_convert($Ip[1], 2, 10); } /** * Replace '::' with appropriate number of ':0' */ function ExpandIPv6Notation($Ip) { if (strpos($Ip, '::') !== false) $Ip = str_replace('::', str_repeat(':0', 8 - substr_count($Ip, ':')).':', $Ip); if (strpos($Ip, ':') === 0) $Ip = '0'.$Ip; return $Ip; } print_r((IPv6ToLong('fe80::c0a8:101',0))); print "\n"; print_r((IPv6ToLong('fe80::192.168.1.1',0))); print "\n"; print_r((IPv6ToLong('::ffff:c0a8:101',0))); print "\n"; print_r(IPv6ToLong(IPv4TO6('192.168.1.1'),0)); print "\n"; print_r((IPv6ToLong('::ffff:192.168.1.1',0))); print "\n"; print sizeof(IPv6ToLong(IPv4TO6('192.168.1.1'),0)); print "\n\n"; if (IPv6ToLong('fe80::c0a8:101') == IPv6ToLong('::ffff:c0a8:101') ){ print "por fin\n"; } if (IPv6ToLong('fe80::c0a8:101') < IPv6ToLong('::ffff:c0a8:101') ){ print "menor"; } if (IPv6ToLong('fe80::c0a8:101') > IPv6ToLong('::ffff:c0a8:101') ){ print "mayor"; } if (IPv6ToLong('fe80::c0a8:101') == IPv6ToLong(IPv4TO6('192.168.1.1')) ){ print "por fin\n"; } $in6_addr = inet_pton('fe80::c0a8:101'); $in4_addr = inet_pton('192.168.1.1'); print_r( $in4_addr ."\n"); print_r( $in6_addr ."\n"); if ($in4_addr === $in6_addr) { print "Both ip addresses are the same"; } $in4_addr = inet_pton(IPv4TO6('192.168.1.1')); if ($in4_addr === $in6_addr) { print "Both ip addresses are the same"; } else { print_r( inet_ntop($in4_addr) ."\n"); print_r( inet_ntop($in6_addr) ."\n"); } ?>