PHP中IP地址与整数的相互转换
IP转换为整数的存储数据库的优化是一个大趋势,许多人仍然使用IP当前存储字符串类型存储字符串索引比整数指数消耗了大量资源,尤其是在数据量大,数据查询一个段的IP,今天说,IP是指IP4,IP6的这篇文章的范围。系统函数ip2long和long2ip
内置函数ip2long PHP可以将IP地址转化为整数。
复制代码代码如下所示:
IP = '210.110.11.49美元;
回声ip2long($ IP);
输出:
复制代码代码如下所示:
- 764540111
减去整数的输出是因为我们的结果是无符号的,有符号整数的最大值是2147483647,结果被转换成无符号类型可以写:
复制代码代码如下所示:
三十五亿三千零四十二万七千一百八十五
用long2ip将整数返回的IP地址
复制代码代码如下所示:
IP = '210.110.11.49美元;
ip_int美元= ip2long($ IP);
回声$。;
回声ip_int美元。;
Echo long2ip ($ip_int);
输出:
复制代码代码如下所示:
210.110.11.49
- 764540111
210.110.11.49
从结果中可以看到,IP和整数可以通过函数完成。
系统功能小错误
这是在线搜索错误,是一个IP与领先0,看看这个bug实例
复制代码代码如下所示:
IP = '210.110.011.49美元;
ip_int美元= ip2long($ IP);
回声$。;
回声ip_int美元。;
回声long2ip($ ip_int);
输出:
复制代码代码如下所示:
210.110.011.49
-764540623
210.110.9.49
转换结果不匹配,我们尝试在IP号的第一部分之前添加向导0,然后再看看它。
复制代码代码如下所示:
IP = '021.110.11.49美元;
ip_int美元= ip2long($ IP);
回声$。;
回声ip_int美元。;
回声long2ip($ ip_int);
输出:
复制代码代码如下所示:
021.110.11.49
二亿九千二百四十二万四千四百九十七
17.110.11.49
所有的转换结果都是错误的,所有这些例子都是转换错误的结果是由于铅0的增加而引起的,而联合反转结果与原始的转换IP不匹配。
转换原理
有两种算法:
第一段和第一段乘以三个256的平方,第二个部分乘以256个平方,第三个部分乘以256,最后一个相加。
复制代码代码如下所示:
IP = '0210.110.11.49美元;
功能iptoint($ IP){
iPARR美元=(爆炸,为IP);
$ = 0;
为($我= 0;$我<计数($ iPARR美元);i++){
Num = intval美元($ iPARR {我})*战俘(256,计数($ iPARR)-($我+ 1));
}
返回$;
}
返回IP;
ip_int = iptoint美元($ IP);
回声ip_int美元。;
回声long2ip($ ip_int);
输出:
复制代码代码如下所示:
0210.110.11.49
三十五亿三千零四十二万七千一百八十五
210.110.11.49
其次,通过位运算符
复制代码代码如下所示:
IP = '0210.110.11.49美元;
功能iptoint($ IP){
iPARR美元=(爆炸,为IP);
返回(intval($ iPARR { 0 } <<(24))| intval($ iPARR { 1 })<< 16(intval)|($ iPARR { 2 })|(<< 8)intval($ iPARR { 3 }));
}
返回IP;
ip_int = iptoint美元($ IP);
回声ip_int美元。;
回声long2ip($ ip_int);
输出:
复制代码代码如下所示:
0210.110.11.49
- 764540111
210.110.11.49
检查IP是否合法
首先,自遍历检测
复制代码代码如下所示:
功能check_ip($ IP){
iPARR美元=(爆炸,为IP);
foreach($ iPARR达V){ if($ V>255)return false;}
返回true;
}
回波210.285.11.49,;
var_dump(check_ip('210.285.11.49 '));
回声';
回波210.205.11.49,;
var_dump(check_ip('210.205.11.49 '));
{代码}
输出:
{代码}
210.285.11.49,bool(假)
210.205.11.49,布尔(真的)
二。返回ip2long
复制代码代码如下所示:
功能check_ip($ IP){
如果(ip2long($ IP))返回true;
返回false;
}
回波210.285.11.49,;
var_dump(check_ip('210.285.11.49 '));
回声';
回波210.205.11.49,;
var_dump(check_ip('210.205.11.49 '));
输出:
复制代码代码如下所示:
210.285.11.49,bool(假)
210.205.11.49,布尔(真的)
后记
许多人使用的IP存储ip2long在int类型的字段,但在不同的系统平台,功能得到ip2long值不同,所以它可能会导致IP被读出和long2ip不匹配原来的IP。
如果是MySQL,你可以使用MySQL系统的功能inet_aton与inet_ntoa解决它,或使用BIGINT类型处理,或写函数本身。