【发布时间】:2011-03-27 03:37:30
【问题描述】:
我已经为 IPv4 “做了”这个;
$ip = '127.0.0.1'; // example
$ip = explode('.',$ip);
if( count($ip) != 4 ) $ip = array(0,0,0,0); // wrong ip format, default to 0.0.0.0
return chr($ip[0]) . chr($ip[1]) . chr($ip[2]) . chr($ip[3]);
我也需要为 IPv6 执行上述操作。通读 IPv6 规范(我承认我没有阅读全部),我看到了一些奇怪的东西(“例外”),例如一组 0 可以压缩为双冒号:“ :0000:0000"=>"::" (如果我的理解是正确的)。 我还看到了如何在 IPv6 字符串中包含 IPv4 样式的字符串:0:0:0:0:0:0:127.0.0.1
让我们先说我不知道从哪里开始。
感谢 Alvaro,现在我有了inet_pton 的纯 PHP 实现:
/**
* @copyright 2004-2007 Aidan Lister <aidan@php.net>, Arpad Ray <arpad@php.net>
* @link http://php.net/inet_pton
* @author Arpad Ray <arpad@php.net>
*/
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;
}
问题是,我不太明白它在做什么。问题是,我不能仅仅使用这样的功能,因为(一方面)我知道它以不同于我正在做(或想要)的格式打包 IP。
【问题讨论】:
-
我从来没有使用过 IPv6(我什至不知道打包表示不是唯一的)但是如果你给出一个输出不匹配的例子和/或你会解释它可能会有所帮助函数的哪一部分你不明白。
-
我有我自己的打包机制。通常的打包算法是把字节加起来,例如,RGB 0,255,255 => 0+255*256+255*256*256 = 16 776 960 = 0xFFFF00 (hex) = 00FFFF (html RGB)。我的“自己的”只是该字符串的直接二进制表示,它不关心字节顺序(使其跨平台等)。
-
问题是我不了解该功能和/或它的作用,因此我不能依赖它的输出(我不只是复制和粘贴代码;))。
-
我试图解释完整的功能,但说真的,您需要一些 PHP 基础知识才能完成此类任务。享受吧!
-
Alvaro,我很清楚这些函数的作用,这是第二个问题,“为什么”,我不明白。总而言之,该功能不能满足我的需要,我也无法理解它在 IPv6 上的工作原理(我认为它很有用)。 :(