php IP转换整形(ip2long)的详解


Posted in PHP onJune 06, 2013

如何将四个字段以点分开的IP网络址协议地址转换成整数呢?PHP里有这么一个函数ip2long.比如

<?php
echo ip2long("10.2.1.3");
?>

我们将得到
167903491

这是如何计算的,目前我知道有两个算法。其一

<?php
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;
}
?>

其二,用位运算
<?php
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来验证一个ip是否是有效的,如

<?php
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 -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类型,这样在64位机器上虽然保存的是3395898803,使用long2ip函数仍能得到正确的结果.

PHP 相关文章推荐
PHP+DBM的同学录程序(1)
Oct 09 PHP
说明的比较细的php 正则学习实例
Jul 30 PHP
允许phpmyadmin空密码登录的配置方法
May 29 PHP
ThinkPHP 防止表单重复提交的方法
Aug 08 PHP
PHP连接Access数据库的方法小结
Jun 20 PHP
php比较相似字符串的方法
Jun 05 PHP
Linux安装配置php环境的方法
Jan 14 PHP
常用PHP数组排序函数归纳
Aug 08 PHP
php遍历替换目录下文件指定内容的方法
Nov 10 PHP
php简单实现单态设计模式的方法分析
Jul 28 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
Dec 21 PHP
PHP 实现base64编码文件上传出现问题详解
Sep 01 PHP
php全局变量和类配合使用深刻理解
Jun 05 #PHP
php数组声明、遍历、数组全局变量使用小结
Jun 05 #PHP
PHP Global变量定义当前页面的全局变量实现探讨
Jun 05 #PHP
PHP 常用数组内部函数(Array Functions)介绍
Jun 05 #PHP
php将gd生成的图片缓存到memcache的小例子
Jun 05 #PHP
深入理解require与require_once与include以及include_once的区别
Jun 05 #PHP
探讨各种PHP字符串函数的总结分析
Jun 05 #PHP
You might like
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
一个非常完美的读写ini格式的PHP配置类分享
2015/02/12 PHP
php封装的page分页类完整实例代码
2020/02/01 PHP
实例:用 JavaScript 来操作字符串(一些字符串函数)
2007/02/15 Javascript
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
js 强制弹出窗口代码研究-又一款代码
2010/03/20 Javascript
javascript 广告后加载,加载完页面再加载广告
2010/11/25 Javascript
EasyUI的treegrid组件动态加载数据问题的解决办法
2011/12/11 Javascript
JavaScript模板入门介绍
2012/09/26 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
2014/05/08 Javascript
基于Jquery代码实现手风琴菜单
2015/11/19 Javascript
学习JavaScript设计模式之中介者模式
2016/01/14 Javascript
js智能获取浏览器版本UA信息的方法
2016/08/08 Javascript
javascript中json对象json数组json字符串互转及取值方法
2017/04/19 Javascript
NodeJS实现微信公众号关注后自动回复功能
2017/05/31 NodeJs
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
Python实现对excel文件列表值进行统计的方法
2015/07/25 Python
python获取当前目录路径和上级路径的实例
2018/04/26 Python
Python简单实现网页内容抓取功能示例
2018/06/07 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
2020/03/30 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
2020/06/01 Python
基于Python采集爬取微信公众号历史数据
2020/11/27 Python
优秀员工个人的自我评价
2013/11/29 职场文书
班组长安全生产职责
2013/12/16 职场文书
手术室护士长竞聘书
2014/03/31 职场文书
个人欠款担保书
2014/05/20 职场文书
最美家庭活动方案
2014/08/31 职场文书
读群众路线的心得体会
2014/09/03 职场文书
2014企业领导班子四风对照检查材料思想汇报
2014/09/17 职场文书
骨干教师考核评语
2014/12/31 职场文书
2015年七一建党节活动总结
2015/03/20 职场文书
离婚案件上诉状
2015/05/23 职场文书
2015年中学体育教师工作总结
2015/10/23 职场文书
简述python四种分词工具,盘点哪个更好用?
2021/04/13 Python
在pycharm中无法import所安装的库解决方案
2021/05/31 Python
浅谈Node的内存泄露问题
2022/05/06 NodeJs