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 相关文章推荐
PHP入门之常量简介和系统常量
May 12 PHP
PHP5.3与5.5废弃与过期函数整理汇总
Jul 10 PHP
php中动态修改ini配置
Oct 14 PHP
PHP中大于2038年时间戳的问题处理方案
Mar 03 PHP
PHP实现冒泡排序的简单实例
May 26 PHP
yii gridview实现时间段筛选功能
Aug 15 PHP
PHP 应用容器化以及部署方法
Feb 12 PHP
php框架CodeIgniter使用redis的方法分析
Apr 13 PHP
PHP简单实现记录网站访问量功能示例
Jun 06 PHP
PHP strripos函数用法总结
Feb 11 PHP
PHP lcfirst()函数定义与用法
Mar 08 PHP
PHP 超级全局变量相关总结
Jun 30 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开发大型项目的一点经验
2006/10/09 PHP
PHP微框架Dispatch简介
2014/06/12 PHP
Linux系统递归生成目录中文件的md5的方法
2015/06/29 PHP
yii使用activeFileField控件实现上传文件与图片的方法
2015/12/28 PHP
Laravel下生成验证码的类
2017/11/15 PHP
PHP实现的敏感词过滤方法示例
2019/03/06 PHP
Thinkphp5 如何隐藏入口文件index.php(URL重写)
2019/10/16 PHP
仿校内登陆框,精美,给那些很厉害但是没有设计天才的程序员
2008/11/24 Javascript
jquery 页面全选框实践代码
2010/04/02 Javascript
Node.js中的流(Stream)介绍
2015/03/30 Javascript
javascript 将共享属性迁移到原型中去的实现方法
2016/08/31 Javascript
详解AngularJs中$resource和restfu服务端数据交互
2016/09/21 Javascript
Validform表单验证总结篇
2016/10/31 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
Jquery Easyui日历组件Calender使用详解(23)
2016/12/18 Javascript
vue绑定设置属性的多种方式(5)
2017/08/16 Javascript
nodejs高大上的部署方式(PM2)
2018/09/11 NodeJs
python实现simhash算法实例
2014/04/25 Python
用Python编写简单的微博爬虫
2016/03/04 Python
python中abs&amp;map&amp;reduce简介
2018/02/20 Python
python安装教程
2018/02/28 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
2019/07/01 Python
django的分页器Paginator 从django中导入类
2019/07/25 Python
实现ECharts双Y轴左右刻度线一致的例子
2020/05/16 Python
Python如何输出警告信息
2020/07/30 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
python生成word合同的实例方法
2021/01/12 Python
美国在线面料商店:Fashion Fabrics Club
2020/01/31 全球购物
为什么要做架构设计
2015/07/08 面试题
计算机专业大学生的自我评价
2013/11/14 职场文书
预备党员思想汇报范文
2013/12/29 职场文书
领导检查欢迎词
2014/01/14 职场文书
服装设计专业毕业生求职信
2014/04/09 职场文书
客户答谢会活动方案
2014/08/31 职场文书
启迪人心的励志语录:脾气永远不要大于本事
2020/01/02 职场文书
俄罗斯十大城市人口排名,第三首都仅排第六,第二是北方首都
2022/03/20 杂记