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

 更新时间:2013年06月06日 09:46:25   作者:  
本篇文章是对php中IP转换整形(ip2long)进行了详细的分析介绍,需要的朋友参考下

如何将四个字段以点分开的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 设计模式之 工厂模式

    用工厂模式设计数据库操作类,本程序要运行在PHP5.0以上,使用本程序可以方便的更换数据库,并且可扩展到其它数据库平台;在换数据库平台时,只是简单的修改数据库类型就可以了。
    2008-12-12
  • 关于页面优化和伪静态

    关于页面优化和伪静态

    页面优化和伪静态的说明。
    2009-10-10
  • PHP+iframe模拟Ajax上传文件功能示例

    PHP+iframe模拟Ajax上传文件功能示例

    这篇文章主要介绍了PHP+iframe模拟Ajax上传文件功能,结合实例形式分析了iframe模拟Ajax上传文件与后台php接收处理相关操作技巧,需要的朋友可以参考下
    2019-07-07
  • PHP采用XML-RPC构造Web Service实例教程

    PHP采用XML-RPC构造Web Service实例教程

    这篇文章主要介绍了PHP采用XML-RPC构造Web Service,需要的朋友可以参考下
    2014-07-07
  • Could not load type System.ServiceModel.Activation.HttpModule解决办法

    Could not load type System.ServiceModel.Activation.HttpModul

    本文章来详细介绍关于Could not load type System.ServiceModel.Activation.HttpModule from assembly System.ServiceModel解决办法,有需要的朋友可参考
    2012-12-12
  • php简单定时执行任务的实现方法

    php简单定时执行任务的实现方法

    这篇文章主要介绍了php简单定时执行任务的实现方法,涉及curl及sleep等操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • 批量修改RAR文件注释的php代码

    批量修改RAR文件注释的php代码

    下面的代码就是我通过我的数据库读取出文件路径并最终实现批量修改RAR文件注释的方法.因为数据库是ACCESS,我新建了一个ODBC源.同时RAR.exe及CMD.EXE都在1.PHP同目录下
    2010-11-11
  • PHP Stream_*系列函数

    PHP Stream_*系列函数

    流(stream)是一种数据抽象。使用流包装数据源后,数据都将会获得统一的操作,不管数据源是文件、网络连接、压缩数据中的哪一种。PHP中的stream_*系列函数就是用来获取、管理流的一组函数。
    2010-08-08
  • PHP通过iconv将字符串从GBK转换为UTF8字符集

    PHP通过iconv将字符串从GBK转换为UTF8字符集

    PHP通过iconv将字符串从GBK转换为UTF8字符集的方法,需要的朋友可以参考下。
    2011-07-07
  • PHP及Zend Engine的线程安全模型分析

    PHP及Zend Engine的线程安全模型分析

    在阅读PHP源码和学习PHP扩展开发的过程中,我接触到大量含有“TSRM”字眼的宏。通过查阅资料,知道这些宏与Zend的线程安全机制有关,而绝大多数资料中都建议按照既定规则使用这些宏就可以,而没有说明这些宏的具体作用
    2011-11-11

最新评论