URN Logo
UNIX Resources » Linux » China Linux Forum » Python 编 程 » 9 » 一段使用QQwry.dat数据文件的python代码
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
一段使用QQwry.dat数据文件的python代码
一段使用QQwry.dat数据文件的python代码 - dgj [2005-05-17 11:31 | 3,698 byte(s)]
 
 
 
 
 
 
 
 
 
Subject: 一段使用QQwry.dat数据文件的python代码
Author: dgj    Posted: 2005-05-17 11:31    Length: 3,698 byte(s)
[Original] [Print] [Top]

# -*- coding: utf-8 -*-

# Programmer: D.G.J
#

"""
"""

import re

def bin2int(s):
r = 0
for i in range(0,len(s)):
r += ord(s[i])*pow(256,i)
return r

def bin2ip(s):
return "%d.%d.%d.%d" % ( ord(s[3]),ord(s[2]),ord(s[1]),ord(s[0]))

def int2ip(i):
return "%d.%d.%d.%d" % (i/(256*256*256), (i%(256*256*256))/(256*256),
(i%(256*256))/(256), i%256)


def ip2int(ip):
m = re.match('^(d+).(d+).(d+).(d+)$',ip)
if not m:
return 0
else:
return
int(m.group(1))*256*256*256+int(m.group(2))*256*256+int(m.group(3))*256+int(m.group(4)
);

def ip2loc(ip):
ip = ip2int(ip)
if not ip:
return "invalid ip"

f = open('qqwry.dat','rb')

index_begin = bin2int(f.read(4))
index_end = bin2int(f.read(4))

a = 0
b = (index_end-index_begin)/7

found = 0
while(b>=a):
c = (a+b)/2
f.seek(index_begin+c*7)
ip1 = bin2int(f.read(4))
if ip1 <= ip:
f.seek(index_begin+c*7+7)
ip2 = bin2int(f.read(4))
if ip2 > ip:
f.seek(index_begin+c*7+4)
found = bin2int(f.read(3))
break;
else:
a = c + 1
else:
b = c - 1

if not found:
f.close()
return "not found"

ip1 = int2ip(ip1)
f.seek(found)
ip2 = bin2ip(f.read(4))

loc1,loc2 = get_loc(f,found+4)

f.close()

return "(%s-%s) %s %s" % ( ip1,ip2,loc1,loc2)

def get_loc(f,idx):
loc1 = ""
loc2 = ""

f.seek(idx)
c = f.read(1)
if ord(c) == 1:
idx = bin2int(f.read(3))
f.seek(idx)
c = f.read(1)

idx2 = 0
if ord(c) == 2:
idx2 = idx+4
idx = bin2int(f.read(3))
f.seek(idx)
c = f.read(1)

while(ord(c)):
loc1 += c
c = f.read(1)

if idx2:
f.seek(idx2)

c = f.read(1)
if ord(c) == 2:
idx = bin2int(f.read(3))
f.seek(idx)
c = f.read(1)

while(ord(c)):
loc2 += c
c = f.read(1)

return (loc1,loc2)


if __name__ == "__main__":
print bin2int('x00x00x00xff')
print bin2ip('x00x00x00xff')
print int2ip(4278190080)
print ip2int('255.0.0.0')
print ip2loc('202.102.249.68')



参照了href=http://dev.csdn.net/article/33/33563.shtm>CSDN上一篇介绍QQwry文件格式的文章
[Original] [Print] [Top]
Subject: Re: 一段使用QQwry.dat数据文件的python代码
Author: dgj    Posted: 2005-05-17 17:09    Length: 279 byte(s)
[Original] [Print] [Top]
其中几个转换函数没有经过仔细推敲,哪位知道又更专业更高效的方法,请相告。

另外:

while(ord(c)):

loc1 += c

c = f.read(1)

这几行代码,可否优化?
[Original] [Print] [Top]
Subject: Re: 一段使用QQwry.dat数据文件的python代码
Author: limodou    Posted: 2005-05-17 17:37    Length: 14 byte(s)
[Original] [Print] [Top]
使用struct模块
----
[Original] [Print] [Top]
Subject: Re: 一段使用QQwry.dat数据文件的python代码
Author: dgj    Posted: 2005-05-18 09:07    Length: 84 byte(s)
[Original] [Print] [Top]
多谢提示

不过数据文件中有三字节表示的长度,struct模块好象没法处理
[Original] [Print] [Top]
Subject: Re: 一段使用QQwry.dat数据文件的python代码
Author: passworld    Posted: 2005-05-18 09:50    Length: 166 byte(s)
[Original] [Print] [Top]
data = f.read()
result = struct.unpack('%ds' % len(data), data)
text_utf8 = result[0]
text_unicode = txt.decode('utf8')

----
[Original] [Print] [Top]
Subject: Re: 一段使用QQwry.dat数据文件的python代码
Author: skywind    Posted: 2005-05-25 11:09    Length: 1,058 byte(s)
[Original] [Print] [Top]
输出中文地址是gb2312啊,给你的程序做了一个小补丁,根据环境做不同的输出(只判断了LANG这
个环境变量),呵呵,不过要求已安装了python-cjkcodecs(http://cjkpython.berlios.de/#CJKC
odecs)



--- test1.py 2005-05-25 10:52:06.864879432 +0800
+++ test2.py 2005-05-25 10:54:27.052567664 +0800
@@ -6,7 +6,7 @@
"""
"""

-import re
+import os, string, re

def bin2int(s):
r = 0
@@ -74,6 +74,13 @@

loc1,loc2 = get_loc(f,found+4)

+ #if LANG env is UTF-8, then convert location info from gb2312 to UTF-8
+ lang = os.getenv ("LANG")
+ utf = string.find (lang, "UTF-8")
+ if utf >= 0 :
+ loc1 = unicode(loc1, "gb2312")
+ loc2 = unicode(loc2, "gb2312")
+
f.close()
[Original] [Print] [Top]
Subject: Re: 一段使用QQwry.dat数据文件的python代码
Author: passworld    Posted: 2005-05-25 22:36    Length: 70 byte(s)
[Original] [Print] [Top]
locale 里有 getpreferredencoding( [do_setlocale]) 可以使用。
----
[Original] [Print] [Top]
Subject: Re: 一段使用QQwry.dat数据文件的python代码
Author: nzy    Posted: 2005-05-26 17:52    Length: 36 byte(s)
[Original] [Print] [Top]
天哪!没有注释会死人的!!!!!:)
[Original] [Print] [Top]
Subject: Re: 一段使用QQwry.dat数据文件的python代码
Author: dgj    Posted: 2005-05-30 15:48    Length: 383 byte(s)
[Original] [Print] [Top]
多谢了!

这段代码在我们的网站里用的时候就发现编码问题了,qqwry.dat是gb2312编码,我们的网站是utf-8编码,我就在输出结果前将字符串转换成了utf-8编码。

捎带给我们的网站作个广告,一个在zope上开发的,结构为apache+squid+zope的教育网站:商城学网(http://www.shangcheng.com.cn)
[Original] [Print] [Top]
« Previous thread
XML最简单的发问
Python 编 程
9
Next thread »
newedit的问题
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 04:11:12, cost 0.059952020645142 ms.