PHP读取纯真IP数据库的函数,以下代码提取自Discuz! X2

$tinyipfile Discuz! 独有高压缩比算法和快速检索的IP数据库路径

下载地址:http://www.discuz.net/thread-1873888-1-1.html

$fullipfile 纯真数据库路径

下载地址:http://update.cz88.net/soft/qqwry.rar

代码:

function convertip($ip) {

$return = '';

if(preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $ip)) {

$iparray = explode('.', $ip);

if($iparray[0] == 10 || $iparray[0] == 127 || ($iparray[0] == 192 && $iparray[1] == 168) || ($iparray[0] == 172 && ($iparray[1] >= 16 && $iparray[1] <= 31))) {

$return = '- LAN';

} elseif($iparray[0] > 255 || $iparray[1] > 255 || $iparray[2] > 255 || $iparray[3] > 255) {

$return = '- Invalid IP Address';

} else {

$tinyipfile = DISCUZ_ROOT.'./data/ipdata/tinyipdata.dat';

$fullipfile = DISCUZ_ROOT.'./data/ipdata/wry.dat';

if(@file_exists($tinyipfile)) {

$return = convertip_tiny($ip, $tinyipfile);

} elseif(@file_exists($fullipfile)) {

$return = convertip_full($ip, $fullipfile);

}

}

}

return $return;

}

function convertip_tiny($ip, $ipdatafile) {

static $fp = NULL, $offset = array(), $index = NULL;

$ipdot = explode('.', $ip);

$ip = pack('N', ip2long($ip));

$ipdot[0] = (int)$ipdot[0];

$ipdot[1] = (int)$ipdot[1];

if($fp === NULL && $fp = @fopen($ipdatafile, 'rb')) {

$offset = @unpack('Nlen', @fread($fp, 4));

$index = @fread($fp, $offset['len'] - 4);

} elseif($fp == FALSE) {

return '- Invalid IP data file';

}

$length = $offset['len'] - 1028;

$start = @unpack('Vlen', $index[$ipdot[0] * 4] . $index[$ipdot[0] * 4 + 1] . $index[$ipdot[0] * 4 + 2] . $index[$ipdot[0] * 4 + 3]);

for ($start = $start['len'] * 8 + 1024; $start < $length; $start += 8) {

if ($index{$start} . $index{$start + 1} . $index{$start + 2} . $index{$start + 3} >= $ip) {

$index_offset = @unpack('Vlen', $index{$start + 4} . $index{$start + 5} . $index{$start + 6} . "\x0");

$index_length = @unpack('Clen', $index{$start + 7});

break;

}

}

@fseek($fp, $offset['len'] + $index_offset['len'] - 1024);

if($index_length['len']) {

return '- '.@fread($fp, $index_length['len']);

} else {

return '- Unknown';

}

}

function convertip_full($ip, $ipdatafile) {

if(!$fd = @fopen($ipdatafile, 'rb')) {

return '- Invalid IP data file';

}

$ip = explode('.', $ip);

$ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];

if(!($DataBegin = fread($fd, 4)) || !($DataEnd = fread($fd, 4)) ) return;

@$ipbegin = implode('', unpack('L', $DataBegin));

if($ipbegin < 0) $ipbegin += pow(2, 32);

@$ipend = implode('', unpack('L', $DataEnd));

if($ipend < 0) $ipend += pow(2, 32);

$ipAllNum = ($ipend - $ipbegin) / 7 + 1;

$BeginNum = $ip2num = $ip1num = 0;

$ipAddr1 = $ipAddr2 = '';

$EndNum = $ipAllNum;

while($ip1num > $ipNum || $ip2num < $ipNum) {

$Middle= intval(($EndNum + $BeginNum) / 2);

fseek($fd, $ipbegin + 7 * $Middle);

$ipData1 = fread($fd, 4);

if(strlen($ipData1) < 4) {

fclose($fd);

return '- System Error';

}

$ip1num = implode('', unpack('L', $ipData1));

if($ip1num < 0) $ip1num += pow(2, 32);

if($ip1num > $ipNum) {

$EndNum = $Middle;

continue;

}

$DataSeek = fread($fd, 3);

if(strlen($DataSeek) < 3) {

fclose($fd);

return '- System Error';

}

$DataSeek = implode('', unpack('L', $DataSeek.chr(0)));

fseek($fd, $DataSeek);

$ipData2 = fread($fd, 4);

if(strlen($ipData2) < 4) {

fclose($fd);

return '- System Error';

}

$ip2num = implode('', unpack('L', $ipData2));

if($ip2num < 0) $ip2num += pow(2, 32);

if($ip2num < $ipNum) {

if($Middle == $BeginNum) {

fclose($fd);

return '- Unknown';

}

$BeginNum = $Middle;

}

}

$ipFlag = fread($fd, 1);

if($ipFlag == chr(1)) {

$ipSeek = fread($fd, 3);

if(strlen($ipSeek) < 3) {

fclose($fd);

return '- System Error';

}

$ipSeek = implode('', unpack('L', $ipSeek.chr(0)));

fseek($fd, $ipSeek);

$ipFlag = fread($fd, 1);

}

if($ipFlag == chr(2)) {

$AddrSeek = fread($fd, 3);

if(strlen($AddrSeek) < 3) {

fclose($fd);

return '- System Error';

}

$ipFlag = fread($fd, 1);

if($ipFlag == chr(2)) {

$AddrSeek2 = fread($fd, 3);

if(strlen($AddrSeek2) < 3) {

fclose($fd);

return '- System Error';

}

$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));

fseek($fd, $AddrSeek2);

} else {

fseek($fd, -1, SEEK_CUR);

}

while(($char = fread($fd, 1)) != chr(0))

$ipAddr2 .= $char;

$AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));

fseek($fd, $AddrSeek);

while(($char = fread($fd, 1)) != chr(0))

$ipAddr1 .= $char;

} else {

fseek($fd, -1, SEEK_CUR);

while(($char = fread($fd, 1)) != chr(0))

$ipAddr1 .= $char;

$ipFlag = fread($fd, 1);

if($ipFlag == chr(2)) {

$AddrSeek2 = fread($fd, 3);

if(strlen($AddrSeek2) < 3) {

fclose($fd);

return '- System Error';

}

$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));

fseek($fd, $AddrSeek2);

} else {

fseek($fd, -1, SEEK_CUR);

}

while(($char = fread($fd, 1)) != chr(0))

$ipAddr2 .= $char;

}

fclose($fd);

if(preg_match('/http/i', $ipAddr2)) {

$ipAddr2 = '';

}

$ipaddr = "$ipAddr1 $ipAddr2";

$ipaddr = preg_replace('/CZ88\.NET/is', '', $ipaddr);

$ipaddr = preg_replace('/^\s*/is', '', $ipaddr);

$ipaddr = preg_replace('/\s*$/is', '', $ipaddr);

if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {

$ipaddr = '- Unknown';

}

return '- '.$ipaddr;

}

php 读取纯真书库,PHP读取纯真IP数据库的函数相关推荐

  1. php获取ip 然后返回地址,PHP调用纯真IP数据库返回具体地址的方法

    我们在日常开发中友很多场景需要显示具体的IP地址,如果调用本地的IP的地址库,这就需要考虑IP地址库数据量的问题,所以我们一般会采用在线的IP地址查询,今天就把PHP如何调用本地的纯真IP地址数据的教 ...

  2. 读取纯真IP数据库的公用组件QQWry.NET

    这是一个读取纯真IP数据库的公用组件接口,我是通过luma的<纯真IP数据库格式详解>了解了纯真IP数据库数据格式,并且基于网络上的一个IPLocation.dll源码的基础改编而来.我为 ...

  3. java读取纯真IP数据库qqwry.dat的源代码

    java读取纯真IP数据库QQwry.dat的源代码,要运行此程序必须有 到网上下载QQwry.dat,下载地址 http://www.cz88.net/down/   由于太大,我这里就不提供了. ...

  4. mysql 纯真ip 导出dat_C# 读取纯真IP数据库QQWry.dat获取地区信息

    using System; using System.Collections.Generic; using System.Text; using System.IO; namespace 纯真IP数据 ...

  5. Python3访问纯真IP数据库的代码

    工作中我们常需要使用纯真IP数据库内的数据做分析,如何使用Python3访问读取纯真IP数据库的方法有很多朋友需要.今天在网上找了一个,分享一下.虽然不知道该代码的作者是谁,顺便感谢一下~~~ #! ...

  6. 纯真IP数据库格式详解

    摘要 网络上的IP数据库以纯真版的最为流行,LumaQQ也采用了纯真版IP数据库做为IP查询功能的基础.不过关于其格式的文档却非常之少,后来终于在网上 找到了一份文档,得以了解其内幕,不过那份文档寥寥 ...

  7. 纯真IP数据库格式详解zt

    摘要 网络上的IP数据库以纯真版的最为流行,LumaQQ也采用了纯真版IP数据库做为IP查询功能的基础.不过关于其格式的文档却非常之少,后来终于在网上找到了一份文档,得以了解其内幕,不过那份文档寥寥数 ...

  8. [转]纯真IP数据库格式详解

    纯真IP数据库格式详解 摘要 网络上的IP数据库以纯真版的最为流行,LumaQQ也采用了纯真版IP数据库做为IP查询功能的基础.不过关于其格式的文档却非常之少,后来终于在网上找到了一份文档,得以了解其 ...

  9. 为PHP增加纯真IP数据库(qqwry)支持https://blog.jiqila.com/post/229/

    当我们的网站需要根据IP来查询IP来源时,我们需要一个IP数据库,而国内最好的IP数据库当属"纯真IP数据库"了.为了读取"纯真IP数据库"中的数据,一般情况下 ...

最新文章

  1. linux下前一天时间格式
  2. 《应届生求职面试全攻略》学习笔记(三)——面试题目分类讲解
  3. jira在linux下面的安装和配置
  4. vue3.x通过ref属性获取元素
  5. Azure开发者任务之一:解决Azure Storage Emulator初始化失败
  6. 哈希集合——hashSet
  7. TYVJ1613 不和谐的公司
  8. Topcoder SRM 144 DIV 1
  9. hermite插值c语言程序,张艳-埃尔米特Hermite 插值逼近的C语言程序.doc
  10. 贴片二极管正负极如何区分
  11. vue 开发app处理手机返回键问题
  12. dos攻击防范 java_php DOS攻击实现代码(附如何防范)
  13. 【STM32】STM32控制继电器实现电动推杆的伸缩
  14. oracle 用户权限设置,oracle用户权限管理使用详解
  15. 天津春季高考历年计算机考试卷,最新春季高考历年真题-天津市春季高考语文试卷...
  16. 融360|简普科技《维度》报告:超过三成受访者遇过理财投资陷阱 90后受害最深
  17. 02-PDI(Kettle)导入与导出
  18. 不会编程如何制作Android辅助功能?
  19. mkdir,rmdir详解
  20. window 使用rabbitMQ 报错Applying plugin configuration to rabbit@... failed.

热门文章

  1. WIN32_FIND_DATA、FILETIME、FindFirstFile对文件的操作
  2. SQL数据库损坏及恢复分析
  3. ReadProcessMemory()
  4. 计算机网络的常见面试题
  5. 未连接到互联网错误的解决方案
  6. 计算机考试照片识别,PS照片JPEGsnoop帮你鉴别
  7. ivew 的offset用法
  8. 头像上传(限制大小,格式,尺寸)
  9. 苹果应用分身_苹果微信双开,现在可以了。
  10. String如何截取字符串长度