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类型处理,或写函数本身。