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 相关文章推荐
Search Engine Friendly的URL设计
Oct 09 PHP
优化PHP代码的53条建议
Mar 27 PHP
PHP5 操作MySQL数据库基础代码
Sep 29 PHP
php Ubb代码编辑器函数代码
Jul 05 PHP
php selectradio和checkbox默认选择的实现方法详解
Jun 29 PHP
CI框架中zip类应用示例
Jun 17 PHP
Destoon实现多表查询示例
Aug 21 PHP
php实现格式化多行文本为Js可用格式
Apr 15 PHP
php数据访问之增删改查操作
May 09 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
Jun 28 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
Feb 07 PHP
PDO::_construct讲解
Jan 27 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
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
2014/06/23 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
2019/01/17 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
2019/09/16 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
js 获取(接收)地址栏参数值的方法
2013/04/01 Javascript
JQuery筛选器全系列介绍
2013/08/27 Javascript
js插件YprogressBar实现漂亮的进度条效果
2015/04/20 Javascript
JS动画效果打开、关闭层的实现方法
2015/05/09 Javascript
JavaScript函数节流概念与用法实例详解
2016/06/20 Javascript
bootstrapfileinput实现文件自动上传
2016/11/08 Javascript
详解webpack分离css单独打包
2017/06/21 Javascript
理解Koa2中的async&amp;await的用法
2018/02/05 Javascript
JS数组求和的常用方法总结【5种方法】
2019/01/14 Javascript
Vue使用富文本编辑器Vue-Quill-Editor(含图片自定义上传服务、清除复制粘贴样式等)
2020/05/15 Javascript
解决vue项目axios每次请求session不一致的问题
2020/10/24 Javascript
[05:03]2018DOTA2亚洲邀请赛主赛事首日回顾
2018/04/04 DOTA
Python中几种操作字符串的方法的介绍
2015/04/09 Python
Python中面向对象你应该知道的一下知识
2019/07/10 Python
numpy数组广播的机制
2019/07/12 Python
基于python实现语音录入识别代码实例
2020/01/17 Python
python字符串判断密码强弱
2020/03/18 Python
Python爬虫爬取、解析数据操作示例
2020/03/27 Python
纯CSS3实现的阴影效果
2014/12/24 HTML / CSS
如何使用canvas绘制可移动网格的示例代码
2020/12/14 HTML / CSS
eBay加拿大站:eBay.ca
2019/06/20 全球购物
本科生学习总结的自我评价
2013/10/02 职场文书
幼儿园教师培训制度
2014/01/16 职场文书
党员党性分析材料
2014/02/17 职场文书
移风易俗倡议书
2014/04/15 职场文书
学习作风建设心得体会
2014/10/22 职场文书
2014年体检中心工作总结
2014/12/23 职场文书
2016学校先进集体事迹材料
2016/02/29 职场文书
导游词之杭州西湖
2019/09/19 职场文书
python 下划线的多种应用场景总结
2021/05/12 Python
redis复制有可能碰到的问题汇总
2022/04/03 Redis
Python可视化神器pyecharts之绘制地理图表练习
2022/07/07 Python