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下将图片以二进制存入mysql数据库中并显示的实现代码
May 27 PHP
PHP生成excel时单元格内换行问题的解决方法
Aug 26 PHP
php模拟asp中的XmlHttpRequest实现http请求的代码
Mar 24 PHP
php常用ODBC函数集(详细)
Jun 24 PHP
php中生成随机密码的自定义函数代码
Oct 21 PHP
js和php邮箱地址验证的实现方法
Jan 09 PHP
将php数组输出html表格的方法
Feb 24 PHP
使用php语句将数据库*.sql文件导入数据库
May 05 PHP
php常用表单验证类用法实例
Jun 18 PHP
浅谈Yii乐观锁的使用及原理
Jul 25 PHP
PHP 断点续传实例详解
Nov 11 PHP
php利用ob_start()清除输出和选择性输出的方法
Jan 18 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中获取url与物理路径的总结
2013/06/21 PHP
jQuery实现单行文字间歇向上滚动源代码
2013/06/02 Javascript
js判断登录与否并确定跳转页面的方法
2015/01/30 Javascript
javascript实现通过表格绘制颜色填充矩形的方法
2015/04/21 Javascript
javascript中数组和字符串的方法对比
2016/07/20 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
2016/08/03 Javascript
Node.js和Express简单入门介绍
2017/03/24 Javascript
Nodejs中Express 常用中间件 body-parser 实现解析
2017/05/22 NodeJs
JS设计模式之访问者模式定义与用法分析
2018/02/05 Javascript
详解Vue SPA项目优化小记
2018/07/03 Javascript
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
JavaScript 实现HTML DOM增删改查操作的常见方法详解
2020/01/04 Javascript
[07:08]2014DOTA2西雅图国际邀请赛 小组赛7月11日TOPPLAY
2014/07/11 DOTA
Python 的 Socket 编程
2015/03/24 Python
利用Pandas 创建空的DataFrame方法
2018/04/08 Python
Flask框架使用DBUtils模块连接数据库操作示例
2018/07/20 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
pyshp创建shp点文件的方法
2018/12/31 Python
pandas dataframe的合并实现(append, merge, concat)
2019/06/24 Python
django drf框架中的user验证以及JWT拓展的介绍
2019/08/12 Python
pyhton中__pycache__文件夹的产生与作用详解
2019/11/24 Python
python文件处理fileinput使用方法详解
2020/01/02 Python
python如何建立全零数组
2020/07/19 Python
英国家居装饰品、户外家具和玻璃器皿购物网站:Rinkit.com
2019/11/04 全球购物
*p++ 自增p 还是p所指向的变量
2016/07/16 面试题
抽象类和接口的区别
2012/09/19 面试题
工程造价与管理专业应届生求职信
2013/11/23 职场文书
写好自荐信的几个要点
2013/12/26 职场文书
工会换届选举方案
2014/05/21 职场文书
小学生清明节演讲稿
2014/09/05 职场文书
《我爱祖国》演讲稿1000字
2014/09/26 职场文书
党员学习新党章思想汇报
2014/10/25 职场文书
贫民窟的百万富翁观后感
2015/06/09 职场文书
《悬崖边的树》读后感2篇
2019/12/02 职场文书
python爬取企查查企业信息之selenium自动模拟登录企查查
2021/04/08 Python
Java实现字符串转为驼峰格式的方法详解
2022/07/07 Java/Android