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制作静态网站的模板框架
Oct 09 PHP
一篇入门的php Class 文章
Apr 04 PHP
php DOS攻击实现代码(附如何防范)
May 29 PHP
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
Jun 01 PHP
PHP使用PHPMailer发送邮件的简单使用方法
Nov 12 PHP
php加速器eAccelerator的配置参数、API详解
May 05 PHP
php文件夹的创建与删除方法
Jan 24 PHP
php创建无限级树型菜单
Nov 05 PHP
解读PHP中上传文件的处理问题
May 29 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
Sep 11 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
PHP+MySQL实现模糊查询员工信息功能示例
Jun 01 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下用cookie统计用户访问网页次数的代码
2010/05/09 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(六)
2014/06/23 PHP
基于ThinkPHP实现的日历功能实例详解
2017/04/15 PHP
判断浏览器的javascript版本的代码
2010/09/03 Javascript
Angularjs 基础入门
2014/12/26 Javascript
asp知识整理笔记3(问答模式)
2015/09/27 Javascript
Angularjs全局变量被作用域监听的正确姿势
2016/02/06 Javascript
JS控制伪元素的方法汇总
2016/04/06 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
2017/01/04 Javascript
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
React组件之间的通信的实例代码
2017/06/27 Javascript
vue双向绑定及观察者模式详解
2019/03/19 Javascript
微信小程序访问豆瓣电影api的实现方法
2019/03/31 Javascript
layui实现数据分页功能
2019/07/27 Javascript
[02:09]DOTA2辉夜杯 EHOME夺冠举杯现场
2015/12/28 DOTA
Python编程使用NLTK进行自然语言处理详解
2017/11/16 Python
详解python中的 is 操作符
2017/12/26 Python
python将文本分每两行一组并保存到文件
2018/03/19 Python
python批量修改图片后缀的方法(png到jpg)
2018/10/25 Python
python函数enumerate,operator和Counter使用技巧实例小结
2020/02/22 Python
Visual Studio code 配置Python开发环境
2020/09/11 Python
Python识别处理照片中的条形码
2020/11/16 Python
Html5实现用户注册自动校验功能实例代码
2016/05/24 HTML / CSS
TripAdvisor西班牙官方网站:全球领先的旅游网站
2018/01/10 全球购物
瑞典多品牌连锁店:Johnells
2021/01/13 全球购物
汽车销售求职自荐信
2013/10/01 职场文书
小学科学教学反思
2014/01/26 职场文书
《我为你骄傲》教学反思
2014/02/20 职场文书
微笑服务演讲稿
2014/05/13 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
2014最新毕业证代领委托书
2014/09/26 职场文书
老干部工作汇报材料
2014/10/28 职场文书
CAD实训总结范文
2015/08/03 职场文书
《卖火柴的小女孩》教学反思
2016/02/19 职场文书
TV动画《神废柴☆偶像》公布先导PV
2022/03/20 日漫
css如何把元素固定在容器底部的四种方式
2022/06/16 HTML / CSS