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+mysql一个名片库程序
Oct 09 PHP
PHP安全性漫谈
Jun 28 PHP
探讨GDFONTPATH能否被winxp下的php支持
Jun 21 PHP
php读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法
Aug 10 PHP
PHP 下载文件时自动添加bom头的方法实例
Jan 10 PHP
php模拟用户自动在qq空间发表文章的方法
Jan 07 PHP
PHP多线程之内部多线程实例分析
Mar 09 PHP
php unicode编码和字符串互转的方法
Aug 12 PHP
PHP判断数组是否为空的常用方法(五种方法)
Feb 08 PHP
php从身份证获取性别和出生年月
Feb 09 PHP
老生常谈PHP 文件写入和读取(必看篇)
May 22 PHP
PHP实现更改hosts文件的方法示例
Aug 08 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
php tp验证表单与自动填充函数代码
2012/02/22 PHP
php递归创建目录的方法
2015/02/02 PHP
PHP 输出缓冲控制(Output Control)详解
2016/08/25 PHP
Prototype使用指南之base.js
2007/01/10 Javascript
ext 代码生成器
2009/08/07 Javascript
js 幻灯片的实现
2011/12/06 Javascript
HTML中的setCapture和releaseCapture使用介绍
2012/03/21 Javascript
{}与function(){}选用空对象{}来存放keyValue
2012/05/23 Javascript
jquery 选择器引擎sizzle浅析
2013/02/06 Javascript
javascript获取设置div的高度和宽度兼容任何浏览器
2013/09/22 Javascript
jQuery中$(function() {});问题详解
2015/08/10 Javascript
全面理解JavaScript中的闭包
2016/05/12 Javascript
ES6新特征数字、数组、字符串
2016/10/01 Javascript
javascript实现去除HTML标签的方法
2016/12/26 Javascript
JS滚动到指定位置导航栏固定顶部
2017/07/03 Javascript
Vue+jquery实现表格指定列的文字收缩的示例代码
2018/01/09 jQuery
Vue动态加载异步组件的方法
2018/11/21 Javascript
详解vue组件中使用路由方法
2019/02/12 Javascript
vue 实现Web端的定位功能 获取经纬度
2019/08/08 Javascript
微信小程序整个页面的自动适应布局的实现
2020/07/12 Javascript
Windows下使Python2.x版本的解释器与3.x共存的方法
2015/10/25 Python
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
2016/04/23 Python
python实现猜单词小游戏
2020/05/22 Python
Python3转换html到pdf的不同解决方案
2019/03/11 Python
解决Django生产环境无法加载静态文件问题的解决
2019/04/23 Python
Python3实现个位数字和十位数字对调, 其乘积不变
2020/05/03 Python
numpy的Fancy Indexing和array比较详解
2020/06/11 Python
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
吸烟检讨书2000字
2014/02/13 职场文书
工商局副局长个人对照检查材料
2014/09/25 职场文书
2014年库房工作总结
2014/11/26 职场文书
合同审查法律意见书
2015/06/04 职场文书
政审证明范文
2015/06/19 职场文书
亲戚关系证明
2015/06/24 职场文书
关于远足的感想
2015/08/10 职场文书
css中z-index: 0和z-index: auto的区别
2021/08/23 HTML / CSS