#!/usr/bin/python
#-*- coding: UTF-8 -*-
from struct import *
import string
#www.iplaypy.com
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 area1
if __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')