ip2long-long2ip

原创
2016-07-29 09:14:45 2150浏览

一,需求原因

Ip地址转换成整形存储,对于数据库优化来说是非常重要的。很多人把ip地址当做字符串类型来存储,当数据量庞大的时候,会很严重的消耗资源。而且,整形的索引速度要远远大于字符串的索引,所以就要用到ip转整形存储,使用时再将整形转回ip。php的ip转换,此文章讲解为ipv4,ipv6不做讲解。

二,系统内置函数

Ip转换整形用到的函数是:ip2long

例:

$ip=” 60.6.205.138”;

echo ip2long($ip);

整形转换ip用到的函数是:long2ip

例:

$ip=”60.6.205.138”;

$ipInt=ip2long($ip);

echo long2ip($ipInt);

三,常见的问题

1. 当ip地址比较大时,转换后的整数会有超过最大整形范围的情况。有符号整型最大值2147483647,当超过这个值就会变为负数。

解决办法:写成$ip = bindec(decbin(ip2long($ip)));

例:
$ip = "192.168.10.1":

$ip= bindec(decbin(ip2long($ip)));

echo $ip;

说明:decbin函数将十进制转换为二进制,bindec函数将二进制转换为整形。

2. 当一些ip地址有前缀0时,转换就会出错。

例:
$ip = '021.110.11.49';

$ip_int = ip2long($ip);

echo $ip."
"; echo $ip_int."
"; echo long2ip($ip_int);

当ip转换为整形后,再转回ip时就会出错,ip地址与原来不符。原因为有前导0.

解决办法:

第一,因为ip转换整形是是以:第一段乘以256的三次方,第二段乘以256的平方,第三段乘以256、最后总和得出的结果。
$ip = '060.06.205.138';

function ipToInt($ip){

$iparr = explode('.',$ip);

$num = 0;

for($i=0;$i';

说明:

intval把变量转换为整数类型

pow(4,2)返回16,返回x的y次方

第二,通过位运算符解决。

$ip = '060.06.205.138'; 

function ipToInt($ip){

$iparr = explode('.',$ip);

return (intval($iparr[0]<<24))|(intval($iparr[1])<<16)|(intval($iparr[2])<<8)| (intval($iparr[3]));
} 
echo  $ip.'
'; $ipInt = ipToInt($ip); echo $ipInt.'
'; echo long2ip($ipInt);

位运算符算法简单说就是,左移三位把当前数乘以2的三次方,左移两位乘以2的平方。右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位或者一律补0,或者补符号位,这由不同的机器而定。

如果大家不理解,就按第一种方法来。

文章到此就结束了,如果大家有什么问题可以留言我们一起讨论。希望大家多动手练练,好加深印象,我们一起加油!


以上就介绍了ip2long-long2ip,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。