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来与ODBC数据连接
Oct 09 PHP
PHP 文件上传进度条的两种实现方法的代码
Nov 25 PHP
可以在线执行PHP代码包装修正版
Mar 15 PHP
PHP 表单提交给自己
Jul 24 PHP
php设计模式 Chain Of Responsibility (职责链模式)
Jun 26 PHP
ThinkPHP中公共函数路径和配置项路径的映射分析
Nov 22 PHP
网站防止被刷票的一些思路与方法
Jan 08 PHP
Laravel 5框架学习之表单
Apr 08 PHP
在WordPress中使用wp_count_posts函数来统计文章数量
Jan 05 PHP
实例详解PHP中html word 互转的方法
Jan 28 PHP
PHP重定向与伪静态区别
Feb 19 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
Jun 16 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 md5下16位和32位的实现代码
2008/04/09 PHP
PHP 加密解密内部算法
2010/04/22 PHP
zen cart新进商品的随机排序修改方法
2010/09/10 PHP
php使用Jpgraph创建3D饼形图效果示例
2017/02/15 PHP
javaScript如何处理从java后台返回的list
2014/04/24 Javascript
获取JS中网页各种高宽与位置的方法总结
2016/07/27 Javascript
使用bootstrap validator的remote验证代码经验分享(推荐)
2016/09/21 Javascript
详解原生js实现offset方法
2017/06/15 Javascript
React如何将组件渲染到指定DOM节点详解
2017/09/08 Javascript
vue中提示$index is not defined错误的解决方式
2020/09/02 Javascript
python删除文件示例分享
2014/01/28 Python
python直接访问私有属性的简单方法
2016/07/25 Python
简单谈谈python中的Queue与多进程
2016/08/25 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
2017/07/24 Python
使用numpy和PIL进行简单的图像处理方法
2018/07/02 Python
python多进程实现文件下载传输功能
2018/07/28 Python
Python GUI编程完整示例
2019/04/04 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
2019/08/08 Python
vscode 配置 python3开发环境的方法
2019/09/19 Python
Python-numpy实现灰度图像的分块和合并方式
2020/01/09 Python
基于Python实现人脸自动戴口罩系统
2020/02/06 Python
python如何实现word批量转HTML
2020/09/30 Python
python两种获取剪贴板内容的方法
2020/11/06 Python
Anaconda详细安装步骤图文教程
2020/11/12 Python
New Balance波兰官方商城:始于1906年,百年慢跑品牌
2017/08/15 全球购物
Pat McGrath Labs官网:世界上最有影响力的化妆师推出的彩妆品牌
2018/01/07 全球购物
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
2014年元旦促销活动方案
2014/02/22 职场文书
机械制造毕业生求职信
2014/03/03 职场文书
水利水电建筑施工应届生求职信
2014/07/04 职场文书
巾帼标兵事迹材料
2014/12/26 职场文书
初中家长评语大全
2014/12/26 职场文书
入党转正介绍人意见
2015/06/03 职场文书
Golang 实现超大文件读取的两种方法
2021/04/27 Golang
Python使用DFA算法过滤内容敏感词
2022/04/22 Python
Redis 限流器
2022/05/15 Redis