一、说明
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 '小端序';
}
参考链接: