python解析读取ip区域信息,python解析ip区域,如下代码使用了pytho
python解析读取ip区域信息,python解析ip区域,如下代码使用了pytho
如下代码使用了python方法,完成解析ip数据库纯真版,并来读取ip区域信息的操作。
python解析读取ip区域信息
#!/usr/bin/python#-*- coding: UTF-8 -*-from struct import *import string#www.iplaypy.comdef 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抓取关键词代码片段,,用python来做数据抓
- python正则过滤文件指定邮箱地址的方法,python邮箱地址
- python实现whois查询功能的方法,python实现whois查询,今天
- Base64码转换的python实现源码,base64python,为了方便测试时
- 用scp备份openstack的instance镜像方法,scpopenstack,以下pyt
- Python xlrd方法实现excel数据查找提取保存操作,pythonxl
- web.py能条件判断的页面执行计时方法,web.py计时,编橙之
- Blowfish加密解密的Python实现方法,blowfishpython,Blowfish加密
- 用VBS脚本读英语的Python代码分享,vbs脚本英语python,这是
- Python print输出彩色字符的方法,pythonprint,Python print
评论关闭