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中fwrite与file_put_contents性能测试代码
Aug 02 PHP
PHP实现的连贯操作、链式操作实例
Jul 08 PHP
php实现的农历算法实例
Aug 11 PHP
php实现给一张图片加上水印效果
Jan 02 PHP
总结PHP中数值计算的注意事项
Aug 14 PHP
PHP Mysqli 常用代码集合
Nov 12 PHP
php获取ajax的headers方法与内容实例
Dec 27 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
Oct 12 PHP
Yii使用DbTarget实现日志功能的示例代码
Jul 21 PHP
laravel入门知识点整理
Sep 15 PHP
PHP7 字符串处理机制修改
Mar 09 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
什么是调频(FM)、调幅(AM)、短波(SW)、长波(LW)
2021/03/01 无线电
SONY SRF-M100的电路分析
2021/03/02 无线电
PHP完整的日历类(CLASS)
2006/11/27 PHP
一些需要禁用的PHP危险函数(disable_functions)
2012/02/23 PHP
PHP中数组合并的两种方法及区别介绍
2012/09/14 PHP
PHP rmdir()函数的用法总结
2019/07/02 PHP
javascript 多级checkbox选择效果
2009/08/20 Javascript
利用a标签自动解析URL分析网址实例
2014/10/20 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
2015/07/17 Javascript
jQuery设置Cookie及删除Cookie实例分析
2016/04/15 Javascript
jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案
2016/12/19 Javascript
如何在Angular2中使用jQuery及其插件的方法
2017/02/09 Javascript
从零开始学习Node.js系列教程之设置HTTP头的方法示例
2017/04/13 Javascript
详解Angular 4.x Injector
2017/05/04 Javascript
使用node.js实现微信小程序实时聊天功能
2018/08/13 Javascript
vue实现键盘输入支付密码功能
2018/08/18 Javascript
vue开发环境配置跨域的方法步骤
2019/01/16 Javascript
微信小程序webview与h5通过postMessage实现实时通讯的实现
2019/08/20 Javascript
countup.js实现数字动态叠加效果
2019/10/17 Javascript
Vue.js页面中有多个input搜索框如何实现防抖操作
2019/11/04 Javascript
[22:07]DOTA2-DPC中国联赛 正赛 iG vs Magma 选手采访
2021/03/11 DOTA
python:socket传输大文件示例
2017/01/18 Python
使用Python快速搭建HTTP服务和文件共享服务的实例讲解
2018/06/04 Python
在Django中URL正则表达式匹配的方法
2018/12/20 Python
Python字典添加,删除,查询等相关操作方法详解
2020/02/07 Python
Django model class Meta原理解析
2020/11/14 Python
神经网络训练采用gpu设置的方式
2021/03/03 Python
关于css中margin的值和垂直外边距重叠问题
2020/10/27 HTML / CSS
工商管理专业应届生求职信
2013/11/04 职场文书
统计员岗位职责
2013/11/14 职场文书
人事助理自荐信
2014/02/02 职场文书
职工代表大会主持词
2014/04/01 职场文书
我的职业生涯规划:打造自己的运动帝国
2014/09/18 职场文书
群众路线自我剖析材料
2014/10/08 职场文书
优秀大学生事迹材料
2014/12/24 职场文书
html css3不拉伸图片显示效果
2021/06/07 HTML / CSS