python访问纯真IP数据库的代码
程序员文章站
2022-04-21 23:02:42
...
核心代码:
#!/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)代码打包下载 http://xiazai.bitsCN.com/201105/yuanma/ipaddress.7z
接下来为大家分享更完美的代码:
#!/usr/bin/env python # coding: utf-8 '''用Python脚本查询纯真IP库 QQWry.Dat的格式如下: +----------+ | 文件头 | (8字节) +----------+ | 记录区 | (不定长) +----------+ | 索引区 | (大小由文件头决定) +----------+ 文件头:4字节开始索引偏移值+4字节结尾索引偏移值 记录区: 每条IP记录格式 ==> IP地址[国家信息][地区信息] 对于国家记录,可以有三种表示方式: 字符串形式(IP记录第5字节不等于0x01和0x02的情况), 重定向模式1(第5字节为0x01),则接下来3字节为国家信息存储地的偏移值 重定向模式(第5字节为0x02), 对于地区记录,可以有两种表示方式: 字符串形式和重定向 最后一条规则:重定向模式1的国家记录后不能跟地区记录 索引区: 每条索引记录格式 ==> 4字节起始IP地址 + 3字节指向IP记录的偏移值 索引区的IP和它指向的记录区一条记录中的IP构成一个IP范围。查询信息是这个 范围内IP的信息 ''' import sys import socket from 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('
上一篇: 内联元素的padding-top属性