PHP的IP转换的详细解决方案,塑造(ip2long)
复制代码代码如下所示:
< PHP
回声ip2long(10.2.1.3 );
>
我们会得到它的
一亿六千七百九十万三千四百九十一
这是这是怎么计算的,现在我知道有两个algorithms.firstly
复制代码代码如下所示:
< PHP
功能ip2int($ IP){
/ /我们第一个IP分为四个部分,为IP1,IP2美元美元美元,IP3 IP4,
列表($ IP1,IP2美元美元美元,IP3,IP4)=爆炸(,
三方和第一第二乘以256,乘以256平方,乘以第三乘以256。
这是我们得到的值
返回的IP1 *战俘(256,3)+ $ IP2 *战俘(256,2)+ $ IP3 IP4 * 256 + $;
}
>
第二,位运算
复制代码代码如下所示:
< PHP
功能ip2int($ IP){
列表($ IP1,IP2美元美元美元,IP3,IP4)=爆炸(,
返回(IP1 << 24美元(美元)| IP2 << 16)|(IP3 << 8美元(美元)| IP4);
}
>
我们将发现一些IP在转换成整数后是负数,这是因为结果是带符号整数,最大值是2147483647,并且应该转换成无符号。
sprintf(% U
它可以被转换为一个正整数,得到的结果和long2ip也可以转换回原来的IP address.ip2long也可以用来验证一个IP是有效的,如
复制代码代码如下所示:
< PHP
功能chk_ip($ IP){
如果(ip2long($ IP)= 1){
返回false;
}
returntrue;
}
应用程序
var_export(chk_ip(10.111.149.42 ));
var_export(chk_ip(10.111.256.42 ));
>
输出真与假
存储在数据库中的数据(MySQL)的时候,我们使用ip2long函数生成一个整数,然后存储在一个int(11)的字段类型,但在不同的系统平台、ip2long函数值是不同的,因此可能会导致数据从数据库中读取数据。通过long2ip误差IP,我们遇到的情况:
我们使用一个int(11)类型(范围2147483648 - 2147483647)在一个IP地址保存ip2long处理结果,如IP的202.105.77.179 ',然后得到的结果在32位机是899068493,而在64位机为3395898803。然后将其放入数据库中,因为超过int(11)范围,所以64个机器结果被保存为int(11):最大值为2147483647。当从数据库中删除,然后得到错误的结果,127.255.255.255将获得IP地址。
解决这个问题有很多方法。例如,我们可以使用MySQL的功能:inet_aton和inet_ntoa处理IP地址,或保存IP地址字段bigint类型,所以,即使3395898803位被保存在64位机器,long2ip功能还可以获得正确的结果。