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 相关文章推荐
vBulletin HACK----显示话题大小和打开新窗口于论坛索引页
Oct 09 PHP
php 静态化实现代码
Mar 20 PHP
php 随机生成10位字符代码
Mar 26 PHP
MYSQL 小技巧 -- LAST_INSERT_ID
Nov 24 PHP
php若干单维数组遍历方法的比较
Sep 20 PHP
解析php中array_merge与array+array的区别
Jun 21 PHP
PHP中使用虚代理实现延迟加载技术
Nov 05 PHP
PHP ajax 异步执行不等待执行结果的处理方法
May 27 PHP
laravel配置Redis多个库的实现方法
Apr 10 PHP
Laravel 添加多语言提示信息的方法
Sep 29 PHP
PhpSpreadsheet设置单元格常用操作汇总
Nov 13 PHP
PHP变量的作用范围实例讲解
Dec 22 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日期处理函数 整型日期格式
2011/01/12 PHP
php中文验证码实现示例分享
2014/01/12 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
Ubuntu中支持PHP5与PHP7双版本的简单实现
2018/08/19 PHP
PHP封装的分页类与简单用法示例
2019/02/25 PHP
基于JQuery的日期联动实现代码
2011/02/24 Javascript
js中eval详解
2012/03/30 Javascript
addEventListener 的用法示例介绍
2014/05/07 Javascript
JS实现判断滚动条滚到页面底部并执行事件的方法
2014/12/18 Javascript
Flash图片上传组件 swfupload使用指南
2015/03/14 Javascript
Ajax 加载数据 练习代码
2017/01/05 Javascript
[原创]SyntaxHighlighter自动识别并加载脚本语言
2017/02/07 Javascript
NodeJS实现微信公众号关注后自动回复功能
2017/05/31 NodeJs
利用vue.js实现被选中状态的改变方法
2018/02/08 Javascript
vue超时计算的组件实例代码
2018/07/09 Javascript
详解在React项目中安装并使用Less(用法总结)
2019/03/18 Javascript
jQuery模拟html下拉多选框的原生实现方法示例
2019/05/30 jQuery
使用layui实现的左侧菜单栏以及动态操作tab项方法
2019/09/10 Javascript
js实现随机抽奖
2020/03/19 Javascript
使用beaker让Facebook的Bottle框架支持session功能
2015/04/23 Python
python关键字and和or用法实例
2015/05/28 Python
使用python实现knn算法
2017/12/20 Python
在keras里实现自定义上采样层
2020/06/28 Python
英国外籍人士的在线超市:British Corner Shop
2019/06/03 全球购物
某个公司的Java笔面试题
2016/03/11 面试题
经理秘书找工作求职信
2013/12/19 职场文书
运动会解说词100字
2014/01/31 职场文书
《分一分》教学反思
2014/04/13 职场文书
国庆宣传标语
2014/06/30 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
理财计划书
2014/08/14 职场文书
2015年毕业实习工作总结
2014/12/12 职场文书
初中班主任工作随笔
2015/08/15 职场文书
求职自荐信该如何书写?
2019/06/24 职场文书
golang中的空接口使用详解
2021/03/30 Python
MySQL子查询中order by不生效问题的解决方法
2021/08/02 MySQL