关于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; }; //
///////////////////////////////////////////////////////////////////// #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 返回 本机地址