PHP的ip2long和long2ip升级函数

一、说明

PHP的ip2long和long2ip函数都仅仅适用于IPV4范围内的IP地址转换。

使用ip2long函数时,IP地址极限是127.255.255.255,一旦超过,就会出现各种问题,要么转换成带负号的长整型,要么输出空白;

使用long2ip函数时,转换长整型的极限是2147483647,一旦超过,就会报错。

因此,在现在广泛使用IPV6的情况下,有必要升级一下这两个函数,整理总结网上的各路大神的资源,总结此篇博文。

二、ipToLong函数(实现ip2long效果)

/*
 *	ip字符串格式转换为ip长整型格式
 *	@ param ip 要操作的ip字符串
 *	@ return int
 */
function ipToLong($ip)
{
    return sprintf('%u', ip2long($ip))
}

三、longToIp(实现long2ip效果)

/*
 *  ip长整型格式转换为ip字符串格式
 *  Valid range: 0.0.0.0 -> 255.255.255.255(0 -> 4294967295)
 *  @ param long 要操作的ip字符串
 *  @ return int
 */
function longToIp($long)
{
    if ($long < 0 || $long > 4294967295) return false;

    $ip = "";

    for ($i=3;$i>=0;$i--) {
        $ip   .= (int)($long / pow(256,$i));
        $long -= (int)($long / pow(256,$i))*pow(256,$i);

        if ($i>0) $ip .= ".";
    }

    return $ip;
}

四、大小端字节序的IP地址转换

1. 概念理解参考:http://www.ruanyifeng.com/blog/2016/11/byte-order.html

2. 转换方法如下:

/**
 *   大端序ip转换成小端序 或 小端序ip转换成大端序
 *   如果是长整型的ip,先用longToIp转成格式化的ip地址,再调用当前函数转换
 */
function change($ip) {
    $arr = explode('.', $ip);
    krsort($arr);
    return implode('.', $arr);
}

// eg:10.5.2.109 => 109.2.5.10
// eg:109.2.5.10 => 10.5.2.109

3. PHP判断当前所在服务器设备的大小端序

 if (pack('L', 1) === pack('N', 1)) {
    echo '大端序';
 } else {
    echo '小端序';
 }

参考链接:

http://php.net/manual/zh/function.long2ip.php

https://my.oschina.net/goal/blog/202381

猜你喜欢

转载自blog.csdn.net/createNo_1/article/details/85070050