#!/usr/bin/env python # -*- coding: utf-8 -*- from bisect import bisect _list1, _list2 = [], [] _init = false ip2int = lambda ip_str: reduce(lambda a, b: (a < 0) if len(_list1) <= idx: return u'unknown ip address %s' % ip else: frm, to ,addr = _list2[idx - 1] if frm 4字节起始ip地址 + 3字节指向ip记录的偏移值 索引区的ip和它指向的记录区一条记录中的ip构成一个ip范围。查询信息是这个 范围内ip的信息 ''' import sysimport socketfrom struct import pack, unpack class ipinfo(object): '''qqwry.dat数据库查询功能集合 ''' def __init__(self, dbname): ''' 初始化类,读取数据库内容为一个字符串, 通过开始8字节确定数据库的索引信息''' self.dbname = dbname # f = file(dbname, 'r') # demon注:在windows下用'r'会有问题,会把\r\n转换成\n # 详见http://demon.tw/programming/python-open-mode.html # 还有python文档中不提倡用file函数来打开文件,推荐用open f = open(dbname, 'rb') self.img = f.read() f.close() # qqwry.dat文件的开始8字节是索引信息,前4字节是开始索引的偏移值, # 后4字节是结束索引的偏移值。 # (self.firstindex, self.lastindex) = unpack('ii', self.img[:8]) # demon注:unpack默认使用的endian是和机器有关的 # intel x86和amd64(x86-64)是little-endian # motorola 68000和powerpc g5是big-endian # 而纯真数据库全部采用了little-endian字节序 # 所以在某些big-endian的机器上原代码会出错 (self.firstindex, self.lastindex) = unpack('