免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1963 | 回复: 0
打印 上一主题 下一主题

读取纯真版IP数据库的代码片断修正版 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-27 21:56 |只看该作者 |倒序浏览

#!/usr/bin/python
# coding=cp936
from struct import*
import string, sys
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(mystr):
    ss = string.split(mystr, '.');
    ip = 0L
    for s in ss:
        ip = (ip  8) + string.atoi(s)
    return ip;
class IpLocater:
    def __init__(self, ipdb_file):
        self.ipdb = open(ipdb_file, 'rb')
        # get index address
        header = self.ipdb.read(8)
        (self.first_index, self.last_index) = unpack('II', header)
        self.index_count = (self.last_index - self.first_index) / 7 + 1
    def getString(self, offset = 0):
        if offset :
            self.ipdb.seek(offset)
        mystr = ''
        if self.ipdb.tell() == 0:
           return '未知地区'
        ch = self.ipdb.read(1)
        (byte,) = unpack('B', ch)
        while byte != 0:
            mystr = mystr + ch
            ch = self.ipdb.read(1)
            (byte,) = unpack('B',ch)
        return mystr
    def getLong3(self, offset = 0):
        if offset :
            self.ipdb.seek(offset)
        mystr = self.ipdb.read(3)
        (a,b) = unpack('HB', mystr)
        return (b  16) + a
    def getAreaAddr(self, offset=0):
        if offset :
            self.ipdb.seek(offset)
        mystr = self.ipdb.read(1)
        (byte,) = unpack('B', mystr)
        if byte == 0x01 or byte == 0x02:
            
            p = self.getLong3()
            if p:
                return self.getString(p)
            else:
                return ''
        else:
            
            self.ipdb.seek(self.ipdb.tell() - 1)
            return self.getString()
    def getAddr(self, offset, ip = 0):
        self.ipdb.seek(offset + 4)
        countryAddr = ''
        areaAddr = ''
        mystr = self.ipdb.read(1)
        (byte,) = unpack('B', mystr)
        if byte == 0x01:
            
            countryOffset = self.getLong3()
            self.ipdb.seek(countryOffset)
            mystr = self.ipdb.read(1)
            (b,) = unpack('B', mystr)
            if b == 0x02:
               
                countryAddr = self.getString(self.getLong3())
                self.ipdb.seek( countryOffset + 4 )
            else:
                countryAddr = self.getString(countryOffset)
            areaAddr = self.getAreaAddr()
        elif byte == 0x02:
            
            countryAddr = self.getString(self.getLong3())
            areaAddr = self.getAreaAddr(offset + 8)
        else:
            countryAddr = self.getString(offset + 4)
            areaAddr = self.getAreaAddr()
        #print countryAddr
        #print areaAddr
        return countryAddr + '/' + areaAddr
    def output(self, first, last):
        if last > self.index_count :
            last = self.index_count
        for index in range(first, last):
            offset = self.first_index + index * 7
            self.ipdb.seek(offset)
            buf = self.ipdb.read(7)
            (ip,of1,of2) = unpack('IHB', buf)
            print '%s - %s' % (ip2string(ip), self.getAddr( of1 + (of2
16)))
    def find(self, ip, left, right):
        if right-left == 1:
            return left
        else:
            middle = (left + right) / 2
            offset = self.first_index + middle * 7
            self.ipdb.seek(offset)
            buf = self.ipdb.read(4)
            (new_ip,) = unpack('I', buf)
            if ip = new_ip :
                return self.find(ip, left, middle)
            else:
                return self.find(ip, middle, right)
    def getIpAddr(self, ip):
        index = self.find(ip, 0, self.index_count - 1)
        ioffset = self.first_index + index * 7
        aoffset = self.getLong3(ioffset + 4)
        address = self.getAddr(aoffset)
        return address
def main(argv=None):
    if len(sys.argv) != 2:
       print 'usage: locate '
       sys.exit(-1)
    ip_locater = IpLocater(r'F:\MyEnvs\OpenSSH\bin\QQWry.Dat')
    ip_locater.output(1, 250000)
    print '共有%d条记录' % ip_locater.index_count
    ip = sys.argv[1]
    address = ip_locater.getIpAddr(string2ip(ip))
    print 'the ip %s come from %s' % (ip, address)
if __name__ == '__main__' :
    main()


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/8780/showart_1845619.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP