欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

ip2long-long2ip

程序员文章站 2022-05-06 16:37:50
...
一,需求原因

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]';

$ipInt = ipToInt($ip);

echo $ipInt.'
'; echo long2ip($ipInt);

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

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

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


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