PHP基于ip2long实现IP转换整形


Posted in PHP onDecember 11, 2020

如何将四个字段以点分开的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;
  }
  return true;
}
//应用
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 相关文章推荐
我的论坛源代码(六)
Oct 09 PHP
php 特殊字符处理函数
Sep 05 PHP
php 数组的一个悲剧?
May 11 PHP
php中的一些数组排序方法分享
Jul 20 PHP
php写的带缓存数据功能的mysqli类
Sep 06 PHP
php内嵌函数用法实例
Mar 20 PHP
PHP中把对象数组转换成普通数组的方法
Jul 10 PHP
怎样搭建PHP开发环境
Jul 28 PHP
php获取远程文件的内容和大小
Nov 03 PHP
PHP实现批量上传单个文件
Dec 29 PHP
php封装的mysqli类完整实例
Oct 18 PHP
Yii2框架数据验证操作实例详解
May 02 PHP
PHP哈希表实现算法原理解析
Dec 11 #PHP
PHP解决高并发的优化方案实例
Dec 10 #PHP
WordPress伪静态规则设置代码实例
Dec 10 #PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
Dec 10 #PHP
php解析非标准json、非规范json的方式实例
Dec 10 #PHP
PHP连接MySQL数据库三种实现方法
Dec 10 #PHP
discuz论坛更换域名,详细文件修改步骤
Dec 09 #PHP
You might like
php常用文件操作函数汇总
2014/11/22 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
Yii框架视图、视图布局、视图数据块操作示例
2019/10/14 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
popdiv
2006/07/14 Javascript
javascript下查找父节点的简单方法
2007/08/13 Javascript
JavaScript QueryString解析类代码
2010/01/17 Javascript
JQuery Ajax 跨域访问的解决方案
2010/03/12 Javascript
JavaScript去掉空格的方法集合
2010/12/28 Javascript
jquer之ajaxQueue简单实现代码
2011/09/15 Javascript
JavaScript SetInterval与setTimeout使用方法详解
2013/11/15 Javascript
js生成缩略图后上传并利用canvas重绘
2014/05/15 Javascript
2014 HTML5/CSS3热门动画特效TOP10
2014/12/07 Javascript
DOM基础教程之使用DOM控制表单
2015/01/20 Javascript
浅谈JQuery+ajax+jsonp 跨域访问
2016/06/25 Javascript
完美的js div拖拽实例代码
2016/09/24 Javascript
Javascript单例模式的介绍和实例
2016/10/08 Javascript
vue之将echart封装为组件
2018/06/02 Javascript
微信小程序自定义toast弹窗效果的实现代码
2018/11/15 Javascript
Vue中通过属性绑定为元素绑定style行内样式的实例代码
2020/04/30 Javascript
JS array数组检测方式解析
2020/05/19 Javascript
Openlayers学习之加载鹰眼控件
2020/09/28 Javascript
[01:18]一目了然!DOTA2DotA快捷操作对比第一弹
2014/07/01 DOTA
重命名批处理python脚本
2013/04/05 Python
Python处理json字符串转化为字典的简单实现
2016/07/07 Python
Python3结合Dlib实现人脸识别和剪切
2018/01/24 Python
python 使用pdfminer3k 读取PDF文档的例子
2019/08/27 Python
Python3 tkinter 实现文件读取及保存功能
2019/09/12 Python
Smallable英国家庭概念店:设计师童装及家居装饰
2017/07/05 全球购物
英语系本科生求职信范文
2013/12/18 职场文书
大学考试作弊检讨书
2014/01/30 职场文书
环保倡议书怎么写
2014/05/16 职场文书
公司晚会策划方案
2014/05/17 职场文书
学术诚信承诺书
2014/05/26 职场文书
超市员工辞职信范文
2015/05/12 职场文书
springboot+WebMagic+MyBatis爬虫框架的使用
2021/08/07 Java/Android