我们将获取

什么将三个字段以点分别的IP互连网址合同地址调换到整数呢?PHP里有这么一个函数ip2long.比方
复制代码 代码如下:
echo ip2long(“10.2.1.3”);
?>

小编们将得到 167903491

那是哪些总括的,如今小编掌握有四个算法。其黄金年代
复制代码 代码如下:
function ip2int($ip){
   //我们先把ip分为四段,$ip1,$ip2,$ip3,$ip4
   list($ip1,$ip2,$ip3,$ip4)=explode(“.”,$ip);
   //然后第大器晚成段乘以256的三遍方,第二段乘以256的平方,第三段乘以256
澳门新蒲京平台,   //那就是我们获得的值
    return$ip1*pow(256,3)+$ip2*pow(256,2)+$ip3*256+$ip4;
}
?>

那么些,用位运算
复制代码 代码如下:
function ip2int($ip){
   list($ip1,$ip2,$ip3,$ip4)=explode(“.”,$ip);
    return($ip1<<24)|($ip2<<16)|($ip3<<8)|($ip4);
}
?>

大家会意识,有个别ip转产生整数后,是负的,那是因为获得的结果是有暗记整型,最大值是2147483647.要把它转载为无符号的,能够用
sprintf(“%u”,ip2long($ip);

就能够转变为正整数。并且获得的结果用long2ip也得以不奇怪调换回原本的ip地址。也足以用ip2long来讲贝拉米(BellamyState of Qatar个ip是还是不是是有效的,如
复制代码 代码如下:
function chk_ip($ip){
   if(ip2long($ip)==”-1″) {
      return false;
    }
    returntrue;
}
//应用
var_export(chk_ip(“10.111.149.42”));
var_export(chk_ip(“10.111.256.42”));
?>

将输出true和false

把ip数据保存在数据库(MySQL卡塔尔(قطر‎中时候,大家习于旧贯用ip2long函数生成整型,然后贮存在三个int(11卡塔尔类型的字段中,不过,在区别的系统平台上,ip2long函数拿到的值是例外的,由此只怕导致在从数据库中读出多少,用long2ip获得ip的时候发出错误,说一下我们相见的事态:
我们用三个int(11卡塔尔类型(范围-2147483648
-2147483647State of Qatar来保存把二个ip地址用ip2long管理得到的结果,举个例子ip是’202.105.77.179′,那么在三十四人机器上拿到的结果是:-899068493,而在63个人机器上却获得3395898803.然后把它写入数据库,由于当先int(11卡塔尔(قطر‎的范围,由此陆十几位机器上的结果被保留为int(11卡塔尔(قطر‎的最大值:2147483647.于是在从数据库中收取的时候,便拿走了错误的结果,会博得”127.255.255.255″那个ip地址.
化解的章程非常多,比方能够用mysql的函数:INET_ATON和INET_NTOA来管理ip地址;大概把保存ip地址的字段改为bigint类型,那样在六拾一个人机器上即使保存的是3395898803,使用long2ip函数还可以收获不错的结果.

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website