关于qqwry.dat数据的格式我就不详细分析了。
网上的教程比较多。。调用很方便。 文件也提供给大家
大小不到9M.
下载地址链接 //解压密码 nidongde2013
//类文件wry.h header
//
#include <windows.h>
#define MAXBUF 50
typedef struct _tagEndInfo
{
BYTE b0;
BYTE b1;
BYTE b2;
BYTE b3;
BYTE buf[MAXBUF];
BYTE bMode;
int offset1;
int offset2;
}EndInfo,PEndInfo;
typedef struct _tagIPOFF
{
BYTE b0;
BYTE b1;
BYTE b2;
BYTE b3;
BYTE off1;
BYTE off2;
BYTE off3;
}IPOFF,*PIPOFF;
typedef struct _tagBE
{
int uBOff;
int uEOff;
}BE,*PBE;
class Data_QQwry
{
public:
DWORD m_dwLastIP;
int m_i;
BE m_be;
IPOFF m_ipoff;
EndInfo m_ei;
Data_QQwry();
virtual ~Data_QQwry();
CHAR * IPAddress2GeoAddress(CHAR* szIP);
CHAR * GetCountryLocal(int index);
CHAR * GetStr(void);
CHAR * GetCountryLocal(BYTE bMode,int ioffset);
CHAR * GetStr(int ioffset);
DWORD GetSIP(int index);
DWORD IPAddress2DWORD(CHAR* szIP);
int GetIndex(CHAR* szIP);
int GetRecordCount(void);
int GetStartIPInfo(int iIndex);
BOOL GetBE(void);
BOOL OpenQQwry(CHAR * pchszFileName);
void CloseQQwry(void);
private:
CHAR * pchStrQQwryFile;
HANDLE m_hFile;
DWORD m_dwReadedBytes;
};
//
//类文件 cpp
/
#include "wry.h"
//
// Construction/Destruction
//
Data_QQwry::Data_QQwry()
{
m_dwReadedBytes=0;
m_hFile=NULL;
pchStrQQwryFile = "QQwry.dat";
OpenQQwry(pchStrQQwryFile);
GetBE();
}
Data_QQwry::~Data_QQwry()
{
CloseQQwry();
}
BOOL Data_QQwry::OpenQQwry(CHAR * pchszFileName)
{
m_hFile=CreateFile(pchszFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (m_hFile==INVALID_HANDLE_VALUE)
return FALSE;
else
return TRUE;
}
void Data_QQwry::CloseQQwry()
{
if(m_hFile!=INVALID_HANDLE_VALUE)
CloseHandle(m_hFile);
}
BOOL Data_QQwry::GetBE()
{
if(!m_hFile)
return FALSE;
ReadFile(m_hFile,&m_be,sizeof(BE),&m_dwReadedBytes,NULL);
if (m_dwReadedBytes>0)
return TRUE;
else
return FALSE;
}
int Data_QQwry::GetStartIPInfo(int iIndex)
{
BYTE buf[MAXBUF];
memset(buf,0,MAXBUF);
int ioff;
ioff=m_be.uBOff+iIndex*7;
if(ioff>m_be.uEOff)
return 0;
SetFilePointer(m_hFile,m_be.uBOff+iIndex*7,NULL,FILE_BEGIN);
ReadFile(m_hFile,&m_ipoff,sizeof(IPOFF),&m_dwReadedBytes,NULL);
ioff=(m_ipoff.off1+m_ipoff.off2*256+m_ipoff.off3*256*256);
SetFilePointer(m_hFile,ioff,NULL,FILE_BEGIN);
ReadFile(m_hFile,&m_ei,sizeof(EndInfo),&m_dwReadedBytes,NULL);
if(m_ei.buf[0]!=1 && m_ei.buf[0]!=2)
{
m_ei.bMode=1;//
for(int i=0;i<MAXBUF;i++)
{
if(m_ei.buf[i]==0)
{
if(m_ei.buf[i+1]==2)
{
m_ei.bMode=2;
m_ei.offset1=m_ei.buf[i+2]+
m_ei.buf[i+3]*256+
m_ei.buf[i+4]*256*256;
}
break;
}
}
}
else if(m_ei.buf[0]==2)
{
m_ei.bMode=3;//
m_ei.offset1=m_ei.buf[1]+m_ei.buf[2]*256+m_ei.buf[3]*256*256;
if(m_ei.buf[4]!=2)
{
m_ei.bMode=3;
}
else
{
m_ei.bMode=4;//
m_ei.offset2=m_ei.buf[5]+m_ei.buf[6]*256+m_ei.buf[7]*256*256;
}
}
else if(m_ei.buf[0]==1)
{
m_ei.offset1=m_ei.buf[1]+m_ei.buf[2]*256+m_ei.buf[3]*256*256;
SetFilePointer(m_hFile,m_ei.offset1,NULL,FILE_BEGIN);
ReadFile(m_hFile,buf,MAXBUF,&m_dwReadedBytes,NULL);
memcpy(m_ei.buf,buf,MAXBUF);
m_ei.bMode=0;
if(m_ei.buf[0]!=2)
{
for(int i=0;i<MAXBUF;i++)
{
if(m_ei.buf[i]==0)
{
if(m_ei.buf[i+1]!=2)
{
m_ei.bMode=5;
}
else
{
m_ei.bMode=6;
m_ei.offset2=m_ei.buf[i+2]+
m_ei.buf[i+3]*256+
m_ei.buf[i+4]*256*256;
}
break;
}
}
}
else
{
if(m_ei.buf[4]!=2)
{
m_ei.bMode=7;//
m_ei.offset2=m_ei.buf[1]+
m_ei.buf[2]*256+
m_ei.buf[3]*256*256;
}
else
{
m_ei.bMode=8;//
m_ei.offset1=m_ei.buf[1]+
m_ei.buf[2]*256+
m_ei.buf[3]*256*256;
m_ei.offset2=m_ei.buf[5]+
m_ei.buf[6]*256+
m_ei.buf[7]*256*256;
}
}
}
return ioff;
}
int Data_QQwry::GetRecordCount(void)
{
if(!m_hFile)
return 0;
if((m_be.uEOff-m_be.uBOff)<0)
return 0;
return (m_be.uEOff-m_be.uBOff)/7+1;
}
CHAR* Data_QQwry::GetStr(int ioffset)
{
if(ioffset>m_be.uEOff)
return "";
BYTE ch=0;
CHAR * buf=new CHAR[MAXBUF];
memset(buf,0,MAXBUF);
SetFilePointer(m_hFile,ioffset,NULL,FILE_BEGIN);
int i=0;
while(TRUE)
{
ReadFile(m_hFile,&ch,1,&m_dwReadedBytes,NULL);
if(ch==0)
break;
buf[i]=ch;
i++;
if(i>50)
break;
}
return buf;
}
CHAR * Data_QQwry::GetCountryLocal(int index)
{
if(index<0 || index>GetRecordCount()-1)
return "没有查到";
return GetCountryLocal(m_ei.bMode,GetStartIPInfo(index)+4);
}
CHAR* Data_QQwry::GetCountryLocal(BYTE bMode,int ioffset)
{
CHAR* pbuf=NULL;
if(bMode==1)//X
{
pbuf=GetStr(ioffset);
lstrcat(pbuf," ");
lstrcat(pbuf,GetStr());
}
if(bMode==2)//
{
pbuf=GetStr(ioffset);
lstrcat(pbuf," ");
lstrcat(pbuf,GetStr(m_ei.offset1));
}
if(bMode==3)//2
{
pbuf=GetStr(m_ei.offset1);
lstrcat(pbuf," ");
lstrcat(pbuf,GetStr(ioffset+4));
}
if(bMode==4)//
{
pbuf=GetStr(m_ei.offset1);
lstrcat(pbuf," ");
lstrcat(pbuf,GetStr(m_ei.offset2));
}
if(bMode==5)//
{
pbuf=GetStr(m_ei.offset1);
lstrcat(pbuf," ");
lstrcat(pbuf,GetStr());
}
if(bMode==6)
{
pbuf=GetStr(m_ei.offset1);
lstrcat(pbuf," ");
lstrcat(pbuf,GetStr(m_ei.offset2));
}
if(bMode==7)
{
pbuf=GetStr(m_ei.offset2);
lstrcat(pbuf," ");
lstrcat(pbuf,GetStr(m_ei.offset1+4));
}
if(bMode==8)
{
pbuf=GetStr(m_ei.offset1);
lstrcat(pbuf," ");
lstrcat(pbuf,GetStr(m_ei.offset2));
}
return pbuf;
}
CHAR * Data_QQwry::GetStr()
{
BYTE ch;
CHAR *buf=new CHAR[MAXBUF];
memset(buf,0,MAXBUF);
int i=0;
while(TRUE)
{
ReadFile(m_hFile,&ch,1,&m_dwReadedBytes,NULL);
if(ch==0)
break;
buf[i]=ch;
i++;
if(i>50)
break;
}
return buf;
}
CHAR* Data_QQwry::IPAddress2GeoAddress(CHAR* szIP)
{
if(szIP==NULL)
return "请输入IP地址";
return GetCountryLocal(GetIndex(szIP));
}
int Data_QQwry::GetIndex(CHAR* szIP)
{
int index=-1;
DWORD dwInputIP;
DWORD dwStartIP;
dwInputIP=IPAddress2DWORD(szIP);
int iT;
int iB,iE;
iB=0;
iE=GetRecordCount()-1;//
iT=iE/2;
while(iB<iE)
{
dwStartIP=GetSIP(iT);//0k
if(dwInputIP==dwStartIP)
{
index =iT;
break;
}
if((iE-iB)<=1)
{
for(int i=iB;i<=iE;i++)
{
dwStartIP=GetSIP(i);
if(dwStartIP<=dwInputIP && dwInputIP<=m_dwLastIP)
{
index=i;
break;
}
}
break;
}
if(dwInputIP>dwStartIP)
{
iB=iT;
}
else
{
iE=iT;
}
iT=iB+(iE-iB)/2;
}
return index;
}
DWORD Data_QQwry::GetSIP(int index)
{
DWORD ip;
BYTE b[3];
int ioff;
if(!m_hFile)
return -1;
if(index>GetRecordCount()-1)
return -1;
if(index<0)
return -1;
ioff=m_be.uBOff+index*7;
//
SetFilePointer(m_hFile,ioff,NULL,FILE_BEGIN);
ReadFile(m_hFile,&ip,4,&m_dwReadedBytes,NULL);
ReadFile(m_hFile,b,3,&m_dwReadedBytes,NULL);
ioff=b[0]+b[1]*256+b[2]*256*256;
SetFilePointer(m_hFile,ioff,NULL,FILE_BEGIN);
ReadFile(m_hFile,&m_dwLastIP,4,&m_dwReadedBytes,NULL);
return ip;
}
DWORD Data_QQwry::IPAddress2DWORD(CHAR* szIP)
{
DWORD iIP=0;
BYTE b[4]={0};
CHAR szTemp[5];
memset(szTemp,0,5);
BYTE ch;
int iLen;
int iXB;
memset(b,0,4);
iLen=lstrlen(szIP);
szIP[iLen]='.';
iXB=0;
iIP=0;
int nIndex=0;
for(int i=0;i<iLen+1;i++)
{
ch=szIP[i];
szTemp[nIndex++]=ch;
if(ch=='.')
{
b[iXB]=atoi(szTemp);
memset(szTemp,0,5);
iXB++;
nIndex=0;
}
}
iIP=b[0]*256*256*256+b[1]*256*256+b[2]*256+b[3];
return iIP;
}
//main cpp
#include "wry.h"
int _tmain(int argc, _TCHAR* argv[])
{
Data_QQwry *DQ = new Data_QQwry;
CHAR * pChstrAddress=new CHAR[50];
CHAR * pChStr=new CHAR[50];
memset(pChStr,0,50);
lstrcpy(pChStr,"127.0.0.1");
CHAR *pChGEo = DQ->IPAddress2GeoAddress(pChStr);
lstrcpy(pChstrAddress,pChGEo);
delete DQ;
delete[]pChStr;
delete[]pChstrAddress;
return 1;
}
//test 返回 本机地址