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')

编橙之家文章,

评论关闭