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 结果集的分页实现代码
Mar 10 PHP
PHP生成Flash动画的实现代码
Mar 12 PHP
php visitFile()遍历指定文件夹函数
Aug 21 PHP
php中判断文件存在是用file_exists还是is_file的整理
Sep 12 PHP
完美解决PHP中的Cannot modify header information 问题
Aug 12 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
Nov 12 PHP
PHP之sprintf函数用法详解
Nov 12 PHP
php递归创建目录的方法
Feb 02 PHP
一个简单安全的PHP验证码类、PHP验证码
Sep 24 PHP
php通过执行CutyCapt命令实现网页截图的方法
Sep 30 PHP
Laravel接收前端ajax传来的数据的实例代码
Jul 20 PHP
PHP实现网站应用微信登录功能详解
Apr 11 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
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
2009/06/08 PHP
PHP5 字符串处理函数大全
2010/03/23 PHP
PHP在线生成二维码(google api)的实现代码详解
2013/06/04 PHP
PHP动态规划解决0-1背包问题实例分析
2015/03/23 PHP
PHP匿名函数和use子句用法实例
2016/03/16 PHP
PHP 读取大文件并显示的简单实例(推荐)
2016/08/12 PHP
jquery实现背景墙聚光灯效果示例分享
2014/03/02 Javascript
JavaScript中奇葩的假值示例应用
2014/03/11 Javascript
JS清除选择内容的方法
2015/01/29 Javascript
JScript中的条件注释详解
2015/04/24 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
2016/10/27 Javascript
jQuery文字轮播特效
2017/02/12 Javascript
支持移动端原生js轮播图
2017/02/16 Javascript
原生js实现倒计时--2018
2017/02/21 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
2018/08/10 Javascript
微信小程序如何获取用户收货地址
2018/11/27 Javascript
微信小程序实现slideUp、slideDown滑动效果及点击空白隐藏功能示例
2018/12/11 Javascript
微信公众号平台接口开发 菜单管理的实现
2019/08/14 Javascript
js DOM的事件常见操作实例详解
2019/12/16 Javascript
Vue使用v-viewer实现图片预览
2020/10/21 Javascript
详解node.js创建一个web服务器(Server)的详细步骤
2021/01/15 Javascript
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
2009/04/09 Python
python中getattr函数使用方法 getattr实现工厂模式
2014/01/20 Python
Python常用模块介绍
2014/11/21 Python
Python下载懒人图库JavaScript特效
2015/05/28 Python
python实现字典(dict)和字符串(string)的相互转换方法
2017/03/01 Python
Python实现的异步代理爬虫及代理池
2017/03/17 Python
win10系统下python3安装及pip换源和使用教程
2020/01/06 Python
Python基于requests实现模拟上传文件
2020/04/21 Python
CSS3 3D旋转rotate效果实例介绍
2016/05/03 HTML / CSS
澳大利亚波西米亚风连衣裙在线商店:Fortunate One
2019/04/01 全球购物
俄罗斯香水和化妆品在线商店:Aroma-butik
2020/02/28 全球购物
内刊编辑求职自荐书范文
2014/02/19 职场文书
《北京的春节》教学反思
2014/04/07 职场文书
学习之星事迹材料
2014/05/17 职场文书
《爬天都峰》教学反思
2016/02/23 职场文书