解析ip数据库纯真版,ip数据库纯真版,QQWry.py#!/u
解析ip数据库纯真版,ip数据库纯真版,QQWry.py#!/u
QQWry.py
#!/usr/bin/python#-*- coding: UTF-8 -*-from struct import *import string#def ip2string( ip ): a = (ip & 0xff000000) >> 24 b = (ip & 0x00ff0000) >> 16 c = (ip & 0x0000ff00) >> 8 d = ip & 0x000000ff return "%d.%d.%d.%d" % (a,b,c,d)def string2ip( str ): ss = string.split(str, '.'); ip = 0L for s in ss: ip = (ip << 8) + string.atoi(s) return ip;class IPSearch: def __init__(self,ip_file): self.ipdb=open(ip_file,'rb') str=self.ipdb.read(8) self.first_index ,self.last_index =unpack("II",str) def getIPLocation(self,ip): IP=string2ip(ip) #print IP count=(self.last_index-self.first_index)/7+1 left=0 right=count middle=(right-left)/2+left while True: if right-left==1: #print 'result:%s'%left return left offset=self.first_index+middle*7 self.ipdb.seek(offset) temp=unpack("I",self.ipdb.read(4))[0] #print 'left:%s right:%s middle:%s value:%d' %( left,right,middle,temp ) if IP<temp: right=middle elif IP>temp: left=middle else: return middle middle=(right-left)/2+left def readpos(self,seek): self.ipdb.seek(seek) num=self.ipdb.read(3) (h,l)=unpack("HB",num) return (l<<16)+h def find(self,ip): ipIndex=self.getIPLocation(ip) offset=self.first_index+ipIndex*7+4 pos_num=self.readpos(offset) #print pos_num return self.getArea(pos_num+4,True) def getString(self,offset): self.ipdb.seek(offset) result='' i=0 word=unpack("B",self.ipdb.read(1))[0] while word!=0: i+=1 word=unpack("B",self.ipdb.read(1))[0] self.ipdb.seek(offset) result=self.ipdb.read(i) #print result return result def getArea(self,offset,deep): self.ipdb.seek(offset) area1='' area2='' str=self.ipdb.read(1) firstw=unpack("B",str)[0] if firstw==1 and deep: return self.getArea(self.readpos(self.ipdb.tell()),True) elif firstw==2 and deep: area1=self.getArea(self.readpos(self.ipdb.tell()),False) area2=self.getArea(offset+4,False) return (area1,area2) elif firstw==2 and not deep: return self.getArea(self.readpos(offset+1),False) else: if deep: area1=self.getString(self.ipdb.tell()-1) area2=self.getString(self.ipdb.tell()) return (area1,area2) else: area1=self.getString(self.ipdb.tell()-1) return area1if __name__ =="__main__": tt=IPSearch('QQWry.dat') ip=raw_input("Enter IP:\n") (area1,area2)=tt.find(ip) print area1,area2 bb=raw_input('Enter key exit')
[Python]代码
#!/usr/bin/python#-*- coding: UTF-8 -*-from struct import *import string#def ip2string( ip ): a = (ip & 0xff000000) >> 24 b = (ip & 0x00ff0000) >> 16 c = (ip & 0x0000ff00) >> 8 d = ip & 0x000000ff return "%d.%d.%d.%d" % (a,b,c,d)def string2ip( str ): ss = string.split(str, '.'); ip = 0L for s in ss: ip = (ip << 8) + string.atoi(s) return ip;class IPSearch: def __init__(self,ip_file): self.ipdb=open(ip_file,'rb') str=self.ipdb.read(8) self.first_index ,self.last_index =unpack("II",str) def getIPLocation(self,ip): IP=string2ip(ip) #print IP count=(self.last_index-self.first_index)/7+1 left=0 right=count middle=(right-left)/2+left while True: if right-left==1: #print 'result:%s'%left return left offset=self.first_index+middle*7 self.ipdb.seek(offset) temp=unpack("I",self.ipdb.read(4))[0] #print 'left:%s right:%s middle:%s value:%d' %( left,right,middle,temp ) if IP<temp: right=middle elif IP>temp: left=middle else: return middle middle=(right-left)/2+left def readpos(self,seek): self.ipdb.seek(seek) num=self.ipdb.read(3) (h,l)=unpack("HB",num) return (l<<16)+h def find(self,ip): ipIndex=self.getIPLocation(ip) offset=self.first_index+ipIndex*7+4 pos_num=self.readpos(offset) #print pos_num return self.getArea(pos_num+4,True) def getString(self,offset): self.ipdb.seek(offset) result='' i=0 word=unpack("B",self.ipdb.read(1))[0] while word!=0: i+=1 word=unpack("B",self.ipdb.read(1))[0] self.ipdb.seek(offset) result=self.ipdb.read(i) #print result return result def getArea(self,offset,deep): self.ipdb.seek(offset) area1='' area2='' str=self.ipdb.read(1) firstw=unpack("B",str)[0] if firstw==1 and deep: return self.getArea(self.readpos(self.ipdb.tell()),True) elif firstw==2 and deep: area1=self.getArea(self.readpos(self.ipdb.tell()),False) area2=self.getArea(offset+4,False) return (area1,area2) elif firstw==2 and not deep: return self.getArea(self.readpos(offset+1),False) else: if deep: area1=self.getString(self.ipdb.tell()-1) area2=self.getString(self.ipdb.tell()) return (area1,area2) else: area1=self.getString(self.ipdb.tell()-1) return area1if __name__ =="__main__": tt=IPSearch('QQWry.dat') ip=raw_input("Enter IP:\n") (area1,area2)=tt.find(ip) print area1,area2 bb=raw_input('Enter key exit')
相关内容
- 计算单词的对应26个字母的数字之和,单词26数字之和
- python3.2加密解密迅雷快车旋风地址,python3.2加密解密
- Python 刷点击量,python刷点击量,[Python]代码im
- Python参数化设计-编程绘图,python参数编程绘图,Python参
- Python 批量获取Baidu关键词的排名并入库,python关键词
- 简单的PHP与Python间Socket通信,phppythonsocket,服务器端Py
- python 实现登陆百度,欢迎指正,python指正,[Python]代码
- 豆瓣-只看楼主-pyquery版,豆瓣楼主-pyquery版,[Python]代码
- 豆瓣-只看楼主,豆瓣-楼主,[Python]代码#
- 编程制-工程图(基础篇),工程基础篇,添加线# -*- cod
评论关闭