php手动实现ip2long和long2ip

php手动实现ip2long和long2ip

    /**
     * 测试
     */
    public function testipAction() {
        $ip = '10.58.101.175';
        echo ip2long($ip);
        echo "<br>";
        echo $this->myip2long($ip);
        echo "<br>";
        echo long2ip('171599279');
        echo "<br>";
        echo $this->mylong2ip('171599279');
    }

    /**
     * 自己实现ip2long
     * @param $ip
     * @return float|int|string
     */
    protected  function myip2long($ip) {
        $newhex = '';
        // 将ip分割成数组
        $ipsArr = explode('.', $ip);
        foreach ($ipsArr as $key => $value) {
            // 十进制最大值是255,如果超过,则直接返回
            if ($value > 255) {
                return '';
            }
            // 将十进制转化为十六进制
            $hex = dechex($value);
            // 每个ip最大是255,十六进制是FF,最大是两位
            // 比如ip:1.1.1.1如果不补0,则十六进制是1111,十进制是4369
            // 如果补0,则十六进制是01010101,十进制是16843009
            if (strlen($hex) < 2) {
                // 如果十六进制长度小于2,则自动补0
                $hex = '0' . $hex;
            }
            $newhex .= $hex;
        }
        // 十六进制转化为十进制
        $intStr = hexdec($newhex);
        return $intStr;
    }

    /**
     * 自己实现long2ip
     * @param $int
     * @return string
     */
    protected function  mylong2ip($int) {
        //  FFFFFF最大为4294967295
        $int = $int >  4294967295  ? 4294967295  : $int;
        // 将十进制转为十六进制
        $hex = dechex($int);
        //为了避免7位ip出现,我们手动补0
        if (strlen($hex) < 8) {
            // 长度小于8,则自动补0
            $hex = '0'. $hex;
        }
        // 每两位进行分组。然后查看每组的第一位是否是0,如果是则去掉。然后把得到的值转为十进制,放在数组中,最后把数组用.连接起来
        for ($i =0; $i<8;$i+=2) {
            $a = substr($hex, $i, 2);
            $ippart = substr($a, 0, 1);
            if ($ippart === '0') {
                $a = substr($a, 1, 1);
            }
            $aparr[] = hexdec($a);
        }
        return implode('.', $aparr);
    }