MyException - 我的异常网
当前位置:我的异常网» PHP » ip2long 跟 long2ip的使用和原生php实现方式

ip2long 跟 long2ip的使用和原生php实现方式

www.MyException.Cn  网友分享于:2013-08-22  浏览:0次
ip2long 和 long2ip的使用和原生php实现方式

ip2long 和 long2ip的使用和原生php实现方式

1、前言

IP转换成整型存储是数据库优化一大趋势,字符串索引比整型索引消耗资源很多,特别是表中数据量大的时候,以及求查询某一个ip段的数据。本文所指的IP是ip4,ip6暂不再讨论范围

2、ip4转化为整形

这里将介绍:

  • php自带函数 ip2long  
  • php原生模拟ip2long的过程

2.1、ip2long

判断一个 ip4 地址是不是合法的 ip,符合则返回一个长整型,不符合返回 false

以下是测试:

然而当 ip4 值较大时,ip2long转化会出现负数的情况

2.2、php原生模拟ip2long的过程

php自带的ip2long虽然好用,由于返回值是int,所以会造成数据溢出,比如有些ip地址转换后变成负数,为了好看,还是需要自己模拟一个ip2long的过程,不多说,先上代码

function ipToInt($ip) {
    $newHex = '';
    $aIp = explode('.', $ip); //将ip分割成数组
    foreach ($aIp as $key => $value) {
        //十进制最大值是255,超过是不合法的ip,直接返回
        if($value > 255){
            return '';
        }
        $hex = dechex($value);//将十进制转为十六进制
        //每个ip段的值最大为255,十六进制为FF,故最长是两位,
        //例IP = 1.1.1.1 如果不补0,则十六进制为 1111,十进制为 4369
        //补0为 十六进制为 01010101,十进制为 16843009
        if(strlen($hex) < 2) {
            $hex = '0'.$hex;   //如果十六进制长度小于2,则自动补0
        }
        $newHex .= $hex;    
    }
    $int = hexdec($newHex);//十六进制转为十进制
    return $int;
}

以下是测试:

3、将整形转化为ip

这里将介绍:

  • php自带函数 long2ip
  • php原生模拟long2ip的过程
3.1、long2ip

long2ip 只会返回0.0.0.0 到255.255.255.255的内容,

传人空值默认返回0.0.0.0,超出最大值返回255.255.255.255

以下为测试:

long2ip可以识别由ip2long转化产生的负数(可喜可贺);所有在使用过程中,ip2long和long2ip一起使用就不会有什么问题,当然也要介绍一下如何用原生的模拟long2ip的过程

3.2、php原生模拟long2ip的过程

php自带的long2ip已经可以解决大部分问题,这里也只是简单介绍一下原生的模拟方法,不多说,先上代码

function intToIp($int) {
    //FFFFFF最大为4294967295
    $int = $int > 4294967295 ? 4294967295 : $int;
    $dec = dechex($int); //讲十进制转为十六进制

    //十六进制默认会忽略最左边的0,毕竟是0了,怎么算都是0,留着也没用
    //但中间的0会保留,而IP的十六进制最大为FFFFFF(大F团)
    //所有为防止7位IP的出现,我们只能手动补0,才能成双成对(2个一对)
    if(strlen($dec) < 8) {
        $dec = '0'.$dec; //如果长度小于8,最自动补0
    }
    for($i = 0; $i < 8; $i += 2){
        $hex = substr($dec, $i, 2);
        $ippart = substr($hex, 0, 1);//截取十六进制的第一位
        if($ippart === '0') {
            $hex = substr($hex, 1, 1);//如果第一位为0,说明原始数值只有1位,还是要拆散
        }
        $aIp[] = hexdec($hex); //将每段十六进制数转换我为十进制,即每个ip段的值
    }
    return implode('.',$aIp);
}
以下为测试: 

4.1、ip2long

判断一个 ip4 地址是不是合法的 ip,符合则返回一个长整型,不符合返回 false

详情参考:http://php.net/manual/en/function.ip2long.php

4.2、dechex

十进制转化为十六进制(不用自己写方法,爽)

详情参考:http://www.php.net/manual/zh/function.dechex.php

4.3、hexdec

十六进制转十进制

详情参考:http://php.net/manual/zh/function.hexdec.php

4.4、long2ip

将长整型转化为 ip4 格式的字符串,用于判断一个ip是否合法

详情参考:http://php.net/manual/en/function.long2ip.php

文章评论

“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
如何成为一名黑客
如何成为一名黑客
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
为什么程序员都是夜猫子
为什么程序员都是夜猫子
10个调试和排错的小建议
10个调试和排错的小建议
漫画:程序员的工作
漫画:程序员的工作
中美印日四国程序员比较
中美印日四国程序员比较
鲜为人知的编程真相
鲜为人知的编程真相
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
代码女神横空出世
代码女神横空出世
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
程序员和编码员之间的区别
程序员和编码员之间的区别
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
我的丈夫是个程序员
我的丈夫是个程序员
每天工作4小时的程序员
每天工作4小时的程序员
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
Java程序员必看电影
Java程序员必看电影
编程语言是女人
编程语言是女人
程序员必看的十大电影
程序员必看的十大电影
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
旅行,写作,编程
旅行,写作,编程
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
我是如何打败拖延症的
我是如何打败拖延症的
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
总结2014中国互联网十大段子
总结2014中国互联网十大段子
一个程序员的时间管理
一个程序员的时间管理
那些争议最大的编程观点
那些争议最大的编程观点
 程序员的样子
程序员的样子
程序员应该关注的一些事儿
程序员应该关注的一些事儿
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
程序员的鄙视链
程序员的鄙视链
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有