#define  _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <stdlib.h>
#include <windows.h>
using namespace std; char *ptr = NULL; //ptr of image//内存映射文件
char *p = NULL; //point to index//索引区
unsigned int total; //ip count inline void Load(void)
{
HANDLE hnd; //file handle
DWORD NumberOfBytesRead; //len
char text[2048]; //patch
char *temp;
unsigned int len; //get patch
if( !GetModuleFileName(0, text, 2048))
return; temp = strrchr(text, 92); // 92 = '\'
*(temp + 1) = NULL;
strcat(temp, "QQwry.dat"); //CreateFile
hnd = CreateFile(text, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(INVALID_HANDLE_VALUE == hnd)
{
::MessageBox(NULL, text, "不能打开文件!", NULL);
return;
} //get len
len = SetFilePointer(hnd, NULL, NULL, FILE_END);
SetFilePointer(hnd, NULL, NULL, FILE_BEGIN); //malloc
ptr = (char*)malloc(len + 9);
if(!ptr)
{
CloseHandle(hnd);
::MessageBox(NULL, "不能分配内存!", NULL, NULL);
return;
} //read
if(!ReadFile(hnd, ptr, len, &NumberOfBytesRead, NULL))
{
CloseHandle(hnd);
free(ptr);
::MessageBox(NULL, text, "不能读入文件!", NULL);
return;
}
CloseHandle(hnd); //calc total - 1
total = (*((unsigned int*)ptr + 1) - *(unsigned int*)ptr); //check file
if(total % 7 != 0)
{
free(ptr);
::MessageBox(NULL, text, "QQwry.dat文件有损坏!", NULL);
return;
} total /= 7;
++total;
p = ptr + *(unsigned int*)ptr; //ptr of index area
} inline unsigned int get_3b(const char *mem)
{
return 0x00ffffff & *(unsigned int*)(mem);
} inline unsigned int str2ip(const char *lp)
{
unsigned int iIP = 0;
unsigned int tmpIP = 0; while(*lp)
{
if('.' == *lp)
{
iIP = 256 * iIP + tmpIP;
tmpIP = 0;
}
else
{
tmpIP = 10 * tmpIP + *lp - '0';
}
++lp;
} iIP = 256 * iIP + tmpIP;
return iIP;
} string _GetAddress(string IPstr)
{
string ret;
if(NULL == p)
{
ret = "";
return ret;
} unsigned int ip = str2ip(IPstr.c_str());
char *now_p; unsigned int begin = 0, end = total;
while(true)
{
if( begin >= end - 1 )
{
break;
}
if( ip < *(unsigned int*)(p + (begin + end)/2 * 7))
{
end = (begin + end) / 2;
}
else
{
begin = (begin + end) / 2;
}
} unsigned int temp = get_3b(p + 7 * begin + 4);
if(ip <= *(unsigned int*)(ptr + temp)) //ok, found
{
now_p = ptr + temp + 4;
if( 0x01 == *now_p ) //如果0x01跳过去找国家
{
now_p = ptr + get_3b(now_p + 1);
}
//country
if( 0x02 == *now_p ) //如果国家0x02再跳
{
ret = ptr + get_3b(now_p + 1);
now_p += 4;
}
else
{
ret = now_p;
for(; *now_p; ++now_p)
;
++now_p;
}
//local
if( 0x02 == *now_p ) //找到国家以后还发现0x02跳过去找地区
{
ret += ptr + get_3b(now_p + 1);
}
else
{
ret += now_p;
}
}
else
{
ret = "未知数据";
}
return ret;
} int main(void)
{
Load();
string ip;
while (cin >> ip)
{
cout << _GetAddress(ip) << endl;
}
return 0;
}

http://hzy3774.iteye.com/blog/1851364

http://hzy3774.iteye.com/blog/1851364

读取纯真IP数据库的更多相关文章

  1. 优化读取纯真IP数据库QQWry.dat获取地区信息

    改自HeDaode 2007-12-28的代码 将之改为从硬盘读取后文件后,将MemoryStream放到内存中,提高后续查询速度 ///<summary> /// 提供从纯真IP数据库搜 ...

  2. PHP利用纯真IP数据库在本地实现IP地址信息查询

    https://blog.csdn.net/myweishanli/article/details/45098693 准备工作: 建议本地IP地址数据库,请到http://www.cz88.net/这 ...

  3. 纯真IP数据库导入mysql

    下载纯真IP数据库 安装后解压到本地为ip.txt 格式为: 1.1.145.0       1.1.147.255     泰国 沙功那空 1.1.148.0       1.1.149.255   ...

  4. python3通过纯真IP数据库查询IP归属地信息

    在网上看到的别人写的python2的代码,修改成了python3. 把纯真IP数据库文件qqwry.dat放到czip.py同一目录下. #! /usr/bin/env python # -*- co ...

  5. 纯真IP数据库(qqwry.dat)转换成最新的IP数据库格式(ipwry.dat)

    纯真IP数据库(qqwry.dat)转换成最新的IP数据库格式(ipwry.dat) 转载自:http://blog.cafeboy.org/2011/02/25/qqwry-to-ipwry/ ht ...

  6. PHP调用纯真IP数据库返回具体地址

    function convertip($ip) { $ip1num = 0; $ip2num = 0; $ipAddr1 =""; $ipAddr2 =""; ...

  7. PHP获取IP及地区信息(纯真IP数据库)

    昨天在写程序的时候,发现在用户的时候记录IP和地区信息也许以后用得上,去网上找了找,发现实现的方式有好多好多,因为我用的ThinkPHP,后来又去TP官网找了找,最后采用了下面这种方法. <?p ...

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

    纯真版IP数据库,优点是记录多,查询速度快,它只用一个文件QQWry.dat就包含了所有记录,方便嵌入到其他程序中,也方便升级.缺点是你想要编辑它却是比较麻烦的,由于其文件格式的限制,你要直接添加IP ...

  9. 纯真IP数据库格式详解 附demo

    纯真版IP数据库,优点是记录多,查询速度快,它只用一个文件QQWry.dat就包含了所有记录,方便嵌入到其他程序中,也方便升级.缺点是你想要编辑它却是比较麻烦的,由于其文件格式的限制,你要直接添加IP ...

随机推荐

  1. 预告:Windows 7 + Tiny Linux 4.19 + XFS + Vmware Workstation 15 (PRO)下篇dockerの奥义

    困 困 等明天再写吧 主题将围绕在Vmware使用持久化XFS disk后machine rm default后不丢失images containers volumes etc.的奇观 并将展开部署c ...

  2. 1046 划拳 (15 分)C语言

    划拳是古老中国酒文化的一个有趣的组成部分.酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字.如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒.两人同赢或两人同输 ...

  3. yum回滚至Kubernetes1.15.7版本

    背景:升级Kubernetes版本从1.14.1-->1.17.0,官方说明不能跨版本升级,所以只好一个版本一个版本升级.最终升到1.17.0后发现API的格式有改动,之前的中间件版本很多不支持 ...

  4. vmware 14 激活码

    VMware虚拟机已升级至14版本,之前的12版本的秘钥已经无法使用,在此分享一下VMware Workstation 14永久激活密钥: CG54H-D8D0H-H8DHY-C6X7X-N2KG6 ...

  5. a:visited不起作用的原因解析

    目前大多数的网站都很少会出现"一个超链接被点击后改变其颜色"的需求,但也还是有一部分网站有这样的实际需求,也是为了能够让用户更容易区分哪些标题是被点击访问过了,这类需求大多在新闻类 ...

  6. dfs - 走过的标记取消

    在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. ...

  7. Oracle Autonomous Health Framework (AHF) 解读

    AHF介绍 Oracle在2019年10月18日发布自治健康框架Autonomous Health Framework (AHF) 19.3,将ORAchk,EXAchk,TFA三种诊断工具合并入AH ...

  8. restframework 分页组件、响应器

    一.分页组件 1.PageNumberPagination a.全局配置 导入模块 from rest_framework.pagination import PageNumberPagination ...

  9. Spring Cloud学习之-什么是Spring Cloud?

    SpringCloud 什么是微服务? 要想学习微服务,首先需要知道什么是微服务?为什么会有微服务?相信看完架构的发展史读者就会明白 架构发展史 单体应用架构 如图所示:将所有的模块,所有内容(页面. ...

  10. 学习 lind layerdiagram 第三弹