解析纯真ip数据库php源码, 纯真数据库IP地理位置查询类
解析纯真ip数据库php源码, 纯真数据库IP地理位置查询类
/*
IP 地理位置查询类
$ip = new ip();
$addr = $ip->ip2addr('125.70.28.14');
p($addr);
*/
class ip
{var $fh; //IP数据库文件句柄var $first; //第一条索引var $last; //最后一条索引var $total; //索引总数//构造函数function __construct($filename='../db/qqwry.dat'){$this->fh = fopen($filename, 'rb'); //qqwry.dat文件$this->first = $this->getLong4();$this->last = $this->getLong4();$this->total = ($this->last - $this->first) / 7; //每条索引7字节}//检查IP合法性function checkIp($ip){$arr = explode('.', $ip);if (count($arr) != 4) {return false;} else {for ($i = 0; $i < 4; $i++) {if ($arr[$i] > 255) {return false;}}}return true;}function getLong4(){//读取little-endian编码的4个字节转化为长整型数$result = unpack('Vlong', fread($this->fh, 4));return $result['long'];}function getLong3(){//读取little-endian编码的3个字节转化为长整型数$result = unpack('Vlong', fread($this->fh, 3) . chr(0));return $result['long'];}//查询信息function getInfo($data = ""){$char = fread($this->fh, 1);while (ord($char) != 0) { //国家地区信息以0结束$data .= $char;$char = fread($this->fh, 1);}return $data;}//查询地区信息function getArea(){$byte = fread($this->fh, 1); //标志字节switch (ord($byte)) {case 0:$area = '';break; //没有地区信息case 1: //地区被重定向fseek($this->fh, $this->getLong3());$area = $this->getInfo();break;case 2: //地区被重定向fseek($this->fh, $this->getLong3());$area = $this->getInfo();break;default:$area = $this->getInfo($byte);break; //地区没有被重定向}return $area;}function ip2addr($ip){if (!$this->checkIp($ip)) {return false;}$ip = pack('N', intval(ip2long($ip)));
//二分查找$l = 0;$r = $this->total;while ($l <= $r) {$m = floor(($l + $r) / 2); //计算中间索引fseek($this->fh, $this->first + $m * 7);$beginip = strrev(fread($this->fh, 4)); //中间索引的开始IP地址fseek($this->fh, $this->getLong3());$endip = strrev(fread($this->fh, 4)); //中间索引的结束IP地址if ($ip < $beginip) { //用户的IP小于中间索引的开始IP地址时$r = $m - 1;} else {if ($ip > $endip) { //用户的IP大于中间索引的结束IP地址时$l = $m + 1;} else { //用户IP在中间索引的IP范围内时$findip = $this->first + $m * 7;break;}}}
//查询国家地区信息fseek($this->fh, $findip);$location['beginip'] = long2ip($this->getLong4()); //用户IP所在范围的开始地址$offset = $this->getlong3();fseek($this->fh, $offset);$location['endip'] = long2ip($this->getLong4()); //用户IP所在范围的结束地址$byte = fread($this->fh, 1); //标志字节switch (ord($byte)) {case 1: //国家和区域信息都被重定向$countryOffset = $this->getLong3(); //重定向地址fseek($this->fh, $countryOffset);$byte = fread($this->fh, 1); //标志字节switch (ord($byte)) {case 2: //国家信息被二次重定向fseek($this->fh, $this->getLong3());$location['country'] = $this->getInfo();fseek($this->fh, $countryOffset + 4);$location['area'] = $this->getArea();break;default: //国家信息没有被二次重定向$location['country'] = $this->getInfo($byte);$location['area'] = $this->getArea();break;}break;case 2: //国家信息被重定向fseek($this->fh, $this->getLong3());$location['country'] = $this->getInfo();fseek($this->fh, $offset + 8);$location['area'] = $this->getArea();break;default: //国家信息没有被重定向$location['country'] = $this->getInfo($byte);$location['area'] = $this->getArea();break;}
//gb2312 to utf-8(去除无信息时显示的CZ88.NET)foreach ($location as $k => $v) {$location[$k] = str_replace('CZ88.NET', '', iconv('gb2312', 'utf-8', $v));}return $location;}
//析构函数function __destruct(){fclose($this->fh);}
}
解析纯真ip数据库php源码, 纯真数据库IP地理位置查询类相关推荐
- 实例源码_SpringBoot数据库源码解析Template实例化操作
Jdbc TemplateAutoConfiguration 在实践过程中,除了数据源的配置外,我们还会经常用到 Jdbc Template.Jdbc Template是 Spring 对数据库的操作 ...
- 基于Python的旅游管理系统微信小程序设计与实现毕业论文+项目源码及数据库
源码获取:我的博客资源页面可以下载!!!! 项目名称 基于Python的旅游管理系统微信小程序设计与实现毕业论文+项目源码及数据库 系统说明 本商业旅游系统可以分为三个部分,即微信小程序的手机客户端 ...
- 资源采集网php源码,YK影视聚合资源采集无需数据库PHP源码V2.3-完全开源
源码无需数据库,直接上传即可访问,支持上传二级目录访问 采集资源网对接的接口通用为CMS苹果接口 免费空间(康乐推荐PHP5.6)使用教程如下----不要问哪里有我们论坛有 一,将压缩包传到 WWW ...
- (免费分享)基于JavaWeb的高校试题库管理系统设计与实现 毕业论文+项目源码及数据库文件(已发)
源码获取:我的博客资源页面可以下载!!!! 项目名称 (免费分享)基于JavaWeb的高校试题库管理系统设计与实现 毕业论文+项目源码及数据库文件(已发) 系统说明 随着信息技术的不断发展,我们已经 ...
- 网站访客系统php,2套网站访客IP黑名单源码有效屏蔽ip(PHP实现,CC防火墙)
网站IP黑名单2组源代码可有效阻止ip(在PHP中实现,可以用作CC防火墙),一组是单页banIP版本(支持PHP5.4或更高版本,未选择服务器环境) ,系统未选中) 一组是整个站点的banIP版本 ...
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
<div id="container"> <div id="header"> <div class=&qu ...
- 基于SSH的通讯网络电子计费系统 毕业论文+任务书+开题报告+文献综述+外文翻译及原文+答辩PPT+代码清单+项目源码及数据库文件
下载地址:https://download.csdn.net/download/junkyio321/40671271 项目介绍: 基于SSH的通讯网络电子计费系统 毕业论文+任务书+开题报告+文献综 ...
- 【转】Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9153761 记得在前面的文章中,我带大家一起从源码的角度分析了Android中Vi ...
- 要的需求 ip提取网站源码带采集 要求是PHP源码
求.ip提取网站源码带采集 要求是PHP源码.必须带采集 类似 小峰IP提取网站,安小莫IP提取,迷惘IP提取,冰封IP提取 免费类型的 不要淘宝类型的 200 转载于:https://www.cnb ...
- [学习总结]7、Android AsyncTask完全解析,带你从源码的角度彻底理解
我们都知道,Android UI是线程不安全的,如果想要在子线程里进行UI操作,就需要借助Android的异步消息处理机制.之前我也写过了一篇文章从源码层面分析了Android的异步消息处理机制,感兴 ...
最新文章
- vector简单实现
- Django models模型
- 决策树——排序算法的理论下界
- php 抽象类 静态 单体设计模式
- zabbix使用ICMP ping监控网络状态
- 吴恩达神经网络和深度学习-学习笔记-4-深度网络
- CentOS 7 + Win 双系统的安装遇到的重要问题
- java中printreader类_java字符流,字符文件输入流FileReader类介绍
- sd u盘 速度测试软件,u盘速度测试(FlashBench)sd卡速度测试
- RGB颜色与十六进制颜色码
- Java 简单计算器
- win10怎么取消小箭头_已取消到该网页的导航,小编教你网页提示已取消到该网页的导航怎么办...
- mongodb 使用$lookup做多表关联处理
- 流利阅读12.28 Seriously, Prada, what were you thinking? Why the fashion industry keeps bumbling into rac
- K8S kube-proxy- iptable模式实现原理分析
- 阚俊青少机器人_长春中医药大学附属医院、中医学院阚俊明副书记一行调研我校中医学类学生培养工作...
- 给大家推荐一款超低功耗的4G低功耗摄像头方案强大的AI功能
- 唯有卡拉特拉瓦,才敢让建筑飞起来!
- C/C++动态申请空间方式
- 软件测试性能工程师工资,软件测试工程师工资一般多少 前景怎么样
热门文章
- I2S/PCM协议及TDM模式详解
- Linux中Tomcat的安装及配置
- linux 共享文件夹 权限
- Pyspider 框架的用法
- mysql学生管理系统毕业设计_学生成绩管理系统设计与实现(MySQL)
- Qt下汉字转拼音,包含二级汉字
- 香农编码(C语言实现香农编码,并计算信源熵、平均码长、编码效率)
- pandownload最新复活版登录失败_神途手游万能登录器app-神途手游万能登录器app最新手机版下载v1.0...
- 高效实用Chrome浏览器,这份Top 20插件榜对你肯定有帮助
- ROS安装教程(ubuntu20.04安装ROS Noetic Ninjemys)