我如何使用PHP简化IP地址?试图long2ip(ip2long(地址))

问题描述 投票:0回答:3

我的系统包括存储IP地址,并将它们与从我的Web界面发送的值第三方框。我有一个用户输入的子网掩码为第三方箱为255.255.255.000的问题,并且盒子存储它为255.255.255.0。然而盒子重新启动,下一次被告知掩模包括000它的结论是,这些值是不同的,并更新其数据库,并重新启动。并重新启动。并重新启动。

我的目的是用简化形式255.255.255.0在我自己的系统中存储的网络掩码来解决这个问题(而作为另一实例店010.001.002.005为10.1.2.5)。但我全新到PHP。我试图代码$mask = long2ip(ip2long($mask))到进入标准化的形式转化,但刚回来0.0.0.0。是不是有什么特别的,我需要做的IP转换为长回来?有没有更好的方式来简化这个?

php ip2long
3个回答
1
投票

要遵循@ka_lin的意见建议,只是爆发,分成几部分,将其转换为int,这将下降,导致0和与破灭重建它...

$mask = implode(".", array_map("intval", explode(".", $mask)));

一个简单的和更少的开销版本假设4个部分IP地址...

list ($o1, $o2, $o3, $o4) = explode(".", $mask);
$mask = (int)$o1.".".(int)$o2.".".(int)$o3.".".(int)$o4;

这是困难的,因为010.001.002.005是一个有效的IP地址,但也可以混淆(有时以0开头的数字是八进制)。


1
投票

ip2long上的错误返回false,它似乎并没有检测到000为有效。由于255.255.255.000不作为有效的IP检测,它会返回false,所以long2ip(false)不会吐出一个有效的IP。

你可以只检查ip2long(input)以前更接受的IP地址返回true。到位有适当的验证将阻止无效的IP地址从破坏系统。尝试了所有可能的无效的IP地址将是不仅仅是实施一个有效的IP,开始与更难实现自动校正。


1
投票

注意事项:ip2long()有一些问题:它不接受有效的IP地址127.1(!经典的符号,但有效)或127.0.0.010(RFC说无效,但大多数读010为八进制数)。

如果gethostbyname()替代。但gethostbyname()有太多的问题:如果输入一个无效的IP(如127.0.0.1234),它使DNS查找并返回源,如果查找失败。

溶液可以是:

long2ip(ip2long(gethostbyname($IP_ADDRESS)))

我个人的解决方案如下功能:

function aton ( $addr )
{
    $l = explode('.',$addr);
    switch (count($l))
    {
        case 0: return FALSE;

        case 1: return intval($l[0]) & 0xffffffff;

        case 2: return  ( intval($l[0]) << 24
                        | intval($l[1])
                        ) & 0xffffffff;

        case 3: return  ( intval($l[0]) << 24
                        | intval($l[1]) << 16
                        | intval($l[2])
                        ) & 0xffffffff;

        default: return ( intval($l[0]) << 24
                        | intval($l[1]) << 16
                        | intval($l[2]) <<  8
                        | intval($l[3])
                        ) & 0xffffffff;
    }
}

有了这个功能,你可以使用:

long2ip(aton($IP_ADDRESS))

顺便说一句,我有喜欢255.255.255.0特殊IP地址从来没有问题。


推荐问答