【发布时间】:2013-01-05 17:05:17
【问题描述】:
在 PHP 中的 replacement alternative for inet_pton() 上,给出以下代码:
<?php
function inet_pton($ip)
{
# ipv4
if (strpos($ip, '.') !== FALSE) {
$ip = pack('N',ip2long($ip));
}
# ipv6
elseif (strpos($ip, ':') !== FALSE) {
$ip = explode(':', $ip);
$res = str_pad('', (4*(8-count($ip))), '0000', STR_PAD_LEFT);
foreach ($ip as $seg) {
$res .= str_pad($seg, 4, '0', STR_PAD_LEFT);
}
$ip = pack('H'.strlen($res), $res);
}
return $ip;
}
?>
但是当使用以下测试代码进行测试时,它显示并非所有条目都是正确的:
<?php
$arrIPs = array(
"2001:0db8:85a3:0000:0000:8a2e:0370:7334",
"fe80:01::af0",
"::af0",
"192.168.0.1",
"0000:0000:0000:0000:0000:0000:192.168.0.1");
foreach($arrIPs as $strIP) {
$strResult = bin2hex(inet_pton($strIP));
echo "From: {$strIP} to: {$strResult}<br />\n";
}
/*
From: 2001:0db8:85a3:0000:0000:8a2e:0370:7334 to: 20010db885a3000000008a2e03707334
From: fe80:01::af0 to: 0000000000000000fe80000100000af0 //Incorrect
From: ::af0 to: 00000000000000000000000000000af0
From: 192.168.0.1 to: c0a80001
From: 0000:0000:0000:0000:0000:0000:192.168.0.1 to: 00000000 //Incorrect
*/
?>
我不知道正确的 IPv6 语法,所以我更喜欢其他更了解 IPv6 和标准的人看看这个并告诉我它有什么问题?
【问题讨论】:
-
我不太明白最后一段。 PEAR 是什么迫使您继续使用 PHP 5.2?为什么不能直接升级到 PHP 5.3? (请记住,PHP 5.2 已经两年不支持了;现在已经过时了)
-
@SDC 显然 5.3 没有为 Windows 提供 PEAR。如果我错了,请告诉我。
-
还有:您上面显示的功能非常错误。如果地址以它开头,它只会正确扩展
::。它错误地将2001:db8::1解释为::2001:db8:0:1。 -
PEAR 是 PHP 软件生态系统中相当标准的一部分。它适用于所有平台上的所有 PHP 版本。无论如何,PEAR 本身不过是其他软件的安装平台; PEAR 安装的大部分软件在必要时可以不安装(现在很多 PHP 软件使用 Composer 或 PHAR 来安装而不是 PEAR,但这与他们使用的 PHP 版本无关)
-
@SDC 你能想象我曾为一家销售 1000 台... 带有 php 5.2 的 debian lenny 服务器的公司工作吗?你愿意远程升级这个 - 工作 - 服务器吗? “升级你的 PHP 版本”主要是一个想象的提示。没有什么值得