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 相关文章推荐
同台服务器使用缓存APC效率高于Memcached的演示代码
Feb 16 PHP
phpmyadmin3 安装配置图解教程
Mar 29 PHP
php 解决旧系统 查出所有数据分页的类
Aug 27 PHP
解析PHP中的内存管理,PHP动态分配和释放内存
Jun 28 PHP
使用Discuz关键词服务器实现PHP中文分词
Mar 11 PHP
不使用php api函数实现数组的交换排序示例
Apr 13 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
Jun 06 PHP
PHP中的流(streams)浅析
Jul 02 PHP
CI(CodeIgniter)模型用法实例分析
Jan 20 PHP
浅谈php fopen下载远程文件的函数
Nov 18 PHP
Laravel学习教程之request validation的编写
Oct 25 PHP
PHP如何开启Opcache功能提升程序处理效率
Apr 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
php session 写入数据库
2016/02/13 PHP
PHP小偷程序的设计与实现方法详解
2016/10/15 PHP
告诉你什么是javascript的回调函数
2014/09/04 Javascript
JavaScript的Date()方法使用详解
2015/06/09 Javascript
Jquery on方法绑定事件后执行多次的解决方法
2016/06/02 Javascript
解析JavaScript数组方法reduce
2016/12/12 Javascript
Angular.js之作用域scope'@','=','&amp;'实例详解
2017/02/28 Javascript
bootstrap table实现单击单元格可编辑功能
2017/03/28 Javascript
js图片放大镜效果实现方法详解
2020/10/28 Javascript
ES6中Symbol类型用法实例详解
2017/04/06 Javascript
浅谈Fetch 数据交互方式
2018/12/20 Javascript
详解一个基于套接字实现长连接的express
2019/03/28 Javascript
详解javascript中的Error对象
2019/04/25 Javascript
vue使用高德地图点击下钻上浮效果的实现思路
2019/10/12 Javascript
javascript浅层克隆、深度克隆对比及实例解析
2020/02/09 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
[44:47]Ti4 循环赛第三日 iG vs NaVi
2014/07/12 DOTA
[01:11]辉夜杯战队访谈宣传片—CDEC.Y
2015/12/26 DOTA
跟老齐学Python之永远强大的函数
2014/09/14 Python
python处理图片之PIL模块简单使用方法
2015/05/11 Python
python SQLAlchemy 中的Engine详解
2019/07/04 Python
使用虚拟环境打包python为exe 文件的方法
2019/08/29 Python
python函数不定长参数使用方法解析
2019/12/14 Python
Python基于stuck实现scoket文件传输
2020/04/02 Python
python使用多线程+socket实现端口扫描
2020/05/28 Python
优质飞蝇钓和渔具:RiverBum
2020/05/10 全球购物
国外软件测试工程师面试题
2016/12/09 面试题
如何通过 CSS 写出火焰效果
2021/03/24 HTML / CSS
英语师范专业毕业生自荐信
2013/09/21 职场文书
医学护理系毕业生求职信
2013/10/01 职场文书
数控专业个人求职信范文
2014/02/05 职场文书
团支书竞选演讲稿
2014/04/28 职场文书
企业领导班子四风对照检查材料
2014/09/27 职场文书
户籍证明模板
2014/09/28 职场文书
派出所副所长四风问题个人整改措施思想汇报
2014/10/13 职场文书
导游词之张家界
2019/10/31 职场文书