python 对纯真数据库操作的代码
来源:互联网 发布:互联网金融大数据风控 编辑:程序博客网 时间:2024/06/05 12:44
#coding=utf-8
""" IPLocator: locate IP in the QQWry.dat.
Usage:
python IPLocator.py <ip>
Create and test with Python 2.2.3.
spadger@bmy <echo.xjtu@gmail.com> 2008-2-19
"""
import socket,string,struct,sys
class IPLocator :
def __init__( self, ipdbFile ):
self.ipdb = open( ipdbFile, "rb" )
str = self.ipdb.read( 8 )
(self.firstIndex,self.lastIndex) = struct.unpack('II',str)
self.indexCount = (self.lastIndex - self.firstIndex)/7+1
print self.getVersion()," 纪录总数: %d 条 " %(self.indexCount)
def getVersion(self):
s = self.getIpAddr(0xffffff00L)
return s
def getAreaAddr(self,offset=0):
if offset :
self.ipdb.seek( offset )
str = self.ipdb.read( 1 )
(byte,) = struct.unpack('B',str)
if byte == 0x01 or byte == 0x02:
p = self.getLong3()
if p:
return self.getString( p )
else:
return ""
else:
self.ipdb.seek(-1,1)
return self.getString( offset )
def getAddr(self,offset,ip=0):
self.ipdb.seek( offset + 4)
countryAddr = ""
areaAddr = ""
str = self.ipdb.read( 1 )
(byte,) = struct.unpack('B',str)
if byte == 0x01:
countryOffset = self.getLong3()
self.ipdb.seek( countryOffset )
str = self.ipdb.read( 1 )
(b,) = struct.unpack('B',str)
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()
return countryAddr + " " + areaAddr
def dump(self, first ,last ):
if last > self.indexCount :
last = self.indexCount
for index in range(first,last):
offset = self.firstIndex + index * 7
self.ipdb.seek( offset )
buf = self.ipdb.read( 7 )
(ip,of1,of2) = struct.unpack("IHB",buf)
print "%d/t%s/t%s" %(index, self.ip2str(ip), self.getAddr( of1 + (of2 << 16) ) )
def setIpRange(self,index):
offset = self.firstIndex + index * 7
self.ipdb.seek( offset )
buf = self.ipdb.read( 7 )
(self.curStartIp,of1,of2) = struct.unpack("IHB",buf)
self.curEndIpOffset = of1 + (of2 << 16)
self.ipdb.seek( self.curEndIpOffset )
buf = self.ipdb.read( 4 )
(self.curEndIp,) = struct.unpack("I",buf)
def getIpAddr(self,ip):
L = 0
R = self.indexCount - 1
while L < R-1:
M = (L + R) / 2
self.setIpRange(M)
if ip == self.curStartIp:
L = M
break
if ip > self.curStartIp:
L = M
else:
R = M
self.setIpRange( L )
#version information,255.255.255.X,urgy but useful
if ip&0xffffff00L == 0xffffff00L:
self.setIpRange( R )
if self.curStartIp <= ip <= self.curEndIp:
address = self.getAddr( self.curEndIpOffset )
#把GB2312转为utf-8
address = unicode(address,'gb2312').encode("utf-8")
else:
address = "未找到该IP的地址"
return address
def getIpRange(self,ip):
self.getIpAddr(ip)
range = self.ip2str(self.curStartIp) + ' - ' +self.ip2str(self.curEndIp)
return range
def getString(self,offset = 0):
if offset :
self.ipdb.seek( offset )
str = ""
ch = self.ipdb.read( 1 )
(byte,) = struct.unpack('B',ch)
while byte != 0:
str = str + ch
ch = self.ipdb.read( 1 )
(byte,) = struct.unpack('B',ch)
return str
def ip2str(self,ip):
return str(ip>>24)+'.'+str((ip>>16)&0xffL)+'.' +\
str((ip>>8)&0xffL)+'.'+str(ip&0xffL)
def str2ip(self,s):
(ip,) = struct.unpack('L',socket.inet_aton(s))
return ((ip>>24)&0xffL)|((ip&0xffL)<<24) \
|((ip>>8)&0xff00L)|((ip&0xff00L)<<8)
def getLong3(self,offset = 0):
if offset :
self.ipdb.seek( offset )
str = self.ipdb.read(3)
(a,b) = struct.unpack('HB',str)
return (b << 16) + a
def getbyip(self,ip):
IPL = IPLocator( "qqwry.dat" )
address = IPL.getIpAddr( IPL.str2ip(ip) )
#ip,运行商,地区,省,国家
range = IPL.getIpRange( IPL.str2ip(ip) )
print "此IP %s 属于 %s \n 所在网段: %s" % (ip,address, range)
""" IPLocator: locate IP in the QQWry.dat.
Usage:
python IPLocator.py <ip>
Create and test with Python 2.2.3.
spadger@bmy <echo.xjtu@gmail.com> 2008-2-19
"""
import socket,string,struct,sys
class IPLocator :
def __init__( self, ipdbFile ):
self.ipdb = open( ipdbFile, "rb" )
str = self.ipdb.read( 8 )
(self.firstIndex,self.lastIndex) = struct.unpack('II',str)
self.indexCount = (self.lastIndex - self.firstIndex)/7+1
print self.getVersion()," 纪录总数: %d 条 " %(self.indexCount)
def getVersion(self):
s = self.getIpAddr(0xffffff00L)
return s
def getAreaAddr(self,offset=0):
if offset :
self.ipdb.seek( offset )
str = self.ipdb.read( 1 )
(byte,) = struct.unpack('B',str)
if byte == 0x01 or byte == 0x02:
p = self.getLong3()
if p:
return self.getString( p )
else:
return ""
else:
self.ipdb.seek(-1,1)
return self.getString( offset )
def getAddr(self,offset,ip=0):
self.ipdb.seek( offset + 4)
countryAddr = ""
areaAddr = ""
str = self.ipdb.read( 1 )
(byte,) = struct.unpack('B',str)
if byte == 0x01:
countryOffset = self.getLong3()
self.ipdb.seek( countryOffset )
str = self.ipdb.read( 1 )
(b,) = struct.unpack('B',str)
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()
return countryAddr + " " + areaAddr
def dump(self, first ,last ):
if last > self.indexCount :
last = self.indexCount
for index in range(first,last):
offset = self.firstIndex + index * 7
self.ipdb.seek( offset )
buf = self.ipdb.read( 7 )
(ip,of1,of2) = struct.unpack("IHB",buf)
print "%d/t%s/t%s" %(index, self.ip2str(ip), self.getAddr( of1 + (of2 << 16) ) )
def setIpRange(self,index):
offset = self.firstIndex + index * 7
self.ipdb.seek( offset )
buf = self.ipdb.read( 7 )
(self.curStartIp,of1,of2) = struct.unpack("IHB",buf)
self.curEndIpOffset = of1 + (of2 << 16)
self.ipdb.seek( self.curEndIpOffset )
buf = self.ipdb.read( 4 )
(self.curEndIp,) = struct.unpack("I",buf)
def getIpAddr(self,ip):
L = 0
R = self.indexCount - 1
while L < R-1:
M = (L + R) / 2
self.setIpRange(M)
if ip == self.curStartIp:
L = M
break
if ip > self.curStartIp:
L = M
else:
R = M
self.setIpRange( L )
#version information,255.255.255.X,urgy but useful
if ip&0xffffff00L == 0xffffff00L:
self.setIpRange( R )
if self.curStartIp <= ip <= self.curEndIp:
address = self.getAddr( self.curEndIpOffset )
#把GB2312转为utf-8
address = unicode(address,'gb2312').encode("utf-8")
else:
address = "未找到该IP的地址"
return address
def getIpRange(self,ip):
self.getIpAddr(ip)
range = self.ip2str(self.curStartIp) + ' - ' +self.ip2str(self.curEndIp)
return range
def getString(self,offset = 0):
if offset :
self.ipdb.seek( offset )
str = ""
ch = self.ipdb.read( 1 )
(byte,) = struct.unpack('B',ch)
while byte != 0:
str = str + ch
ch = self.ipdb.read( 1 )
(byte,) = struct.unpack('B',ch)
return str
def ip2str(self,ip):
return str(ip>>24)+'.'+str((ip>>16)&0xffL)+'.' +\
str((ip>>8)&0xffL)+'.'+str(ip&0xffL)
def str2ip(self,s):
(ip,) = struct.unpack('L',socket.inet_aton(s))
return ((ip>>24)&0xffL)|((ip&0xffL)<<24) \
|((ip>>8)&0xff00L)|((ip&0xff00L)<<8)
def getLong3(self,offset = 0):
if offset :
self.ipdb.seek( offset )
str = self.ipdb.read(3)
(a,b) = struct.unpack('HB',str)
return (b << 16) + a
def getbyip(self,ip):
IPL = IPLocator( "qqwry.dat" )
address = IPL.getIpAddr( IPL.str2ip(ip) )
#ip,运行商,地区,省,国家
range = IPL.getIpRange( IPL.str2ip(ip) )
print "此IP %s 属于 %s \n 所在网段: %s" % (ip,address, range)
return address,range
以下代码不可直接粘贴复制运行,需调试后才可运行
self.__IPL = IPLocator.IPLocator( "qqwry.dat" )
address = self.__IPL.getIpAddr( self.__IPL.str2ip(ip) )
#ip,运行商,地区,省,国家
range = self.__IPL.getIpRange( self.__IPL.str2ip(ip) )
print address,range
0 0
- python 对纯真数据库操作的代码
- python访问纯真IP数据库的示例代码
- C#读取纯真IP数据库的代码
- C#读取纯真IP数据库的代码
- C#读取纯真IP数据库的代码
- python读取纯真数据库
- python对数据库的操作
- java实现对纯真IP数据库的查询
- 纯真IP数据库查询代码
- 读取纯真IP数据库代码
- python访问纯真IP数据库
- Python读取纯真IP数据库
- "Hibernate"对数据库操作的实例代码
- JAVA:对数据库的一系列操作代码
- python对access数据库的操作
- Python对MySQL数据库的操作
- Python中对mysql数据库的操作
- 读取纯真ip的代码.
- [LeetCode 293] Flip Game
- 随机产生5个从0到10之间不重复的整数
- linux命令大全
- JAVA replaceAll 正则表达式(持续更新)
- handler机制的原理
- python 对纯真数据库操作的代码
- Linux配置自动发送邮件
- Kth number (HDU_2665) 划分树
- ubuntu 安装配置jdk+eclipse+android sdk
- lintcode:Largest Number
- POJ 2349 Arctic Network(Prim)
- linux_shell_HERE Document
- 机房收费系统之开发进度月报
- Android Studio 添加第三方依赖后,控件属性不提示