`

读取lumaQQ的ip数据文件

阅读更多
根据网上搜索的资料,稍做改动。

from struct import *  
import socket


def Ip2Int(ip):
    import struct,socket
    return struct.unpack("!I",socket.inet_aton(ip))[0]


def Int2Ip(i):
    import socket,struct
    return socket.inet_ntoa(struct.pack("!I",i))



class IpLook():
   
   
   
    def __init__ ( self, fileName ):
        self.dataFile = None;
        self.head = None;
        self.index = [];
        self.start( fileName );
   
    def start( self, fileName ):
        self.dataFile = open( fileName, 'rb' );
   
   
    def end( self ):
        if self.dataFile:
            self.dataFile.close();
   
    def readHead( self):
        self.dataFile.seek( 0 );
        str = self.dataFile.read( 8 )
        self.head = unpack('II', str);
        print "head= %d, %d" % self.head
   
   
    def readIndex( self ):
        bytes = self.head[1]-self.head[0] + 7;
        count = bytes/7
        print "count = ", count
        self.dataFile.seek( self.head[0] )
        for start in range( 0, count ):
            ( ip, of1, of2 ) = unpack( 'IHB', self.dataFile.read( 7 ) )
            #print ip, of1, of2
            #print pack("!I",ip)
            self.index.append( ( ip, (of2<<16) + of1 ) )
            #self.index.append( ( unpack( 'I', self.dataFile.read( 4 ) ), \
            #                 unpack( 'I', self.dataFile.read( 3 ) ) ))
           
        #print "index===="
        #print self.index
        #print "index end"
   
   
    def findIPPoint( self, ip, start, end ):
        if( self.index[ start][0] == ip ):
            return ( start, self.index[ start][1] )
        if( self.index[ end][0] == ip ):
            return ( end, self.index[ end][1] )
        if( end - start ==1 ):
            return ( start, self.index[ start][1] )
        middle = (start+end)/2;
        if( ip == self.index[ middle ][0] ):
            return ( middle, self.index[ middle ][1] )
        if( ip < self.index[ middle ][0] ):
            return self.findIPPoint( ip, start, middle );
        else:
            return self.findIPPoint( ip, middle, end );
       
    def findIPAddress( self, ip ):
        index, point = self.findIPPoint( ip, 0, len( self.index)-1 );
        if point:
            self.dataFile.seek( point )
            (ip,) = unpack( 'I', self.dataFile.read( 4 )  )
            print "find ip =",socket.inet_ntoa( pack('!I', ip ) )
           
            byte = self.dataFile.read( 1 )
            if byte == '\x01' :
                countryPoint = self.readPoint()
                self.dataFile.seek( countryPoint )
                byte = self.dataFile.read( 1 )
                if byte == '\x02':
                    countryPoint2 = self.readPoint()
                    country = self.readString( countryPoint2 )
                    self.dataFile.seek( countryPoint + 4 )
                else:
                    country = self.readString( countryPoint )
                byte = self.dataFile.read( 1 )
                if byte == '\x02' or byte == '\x01':
                    areaPoint = self.readPoint()
                    area = self.readString( areaPoint )
                else:
                    area = self.readString( countryPoint + len( country) + 1 )
            elif byte == '\x02':
               
                countryPoint = self.readPoint()
                country = self.readString( countryPoint )
                area = self.readString( point + 8 )
            else:
                country = self.readString( point + 4 );
                area = self.readString( point + 4 + len(country) +1 );
            return ( Int2Ip( ip ), country, area)
           
   
    def readPoint( self ):
        (offset1, offset2) = unpack( 'HB', self.dataFile.read( 3 ) )
        return (offset2<<16) + offset1
   
    def readString( self, offset = 0 ):
        self.dataFile.seek( offset )
        buffer = [];
        byte = self.dataFile.read(1)
        while byte != '\x00':
            buffer.append( byte )
            byte = self.dataFile.read(1);
        return "".join(buffer)#.decode( "UTF-8")  
       
       


if __name__ == "__main__":
    look = IpLook( "QQWry.Dat" );
   
    try:
        look.readHead( )
        look.readIndex()
       
        print look.findIPAddress( Ip2Int( "4.0.0.0" ) )
    #except Exception,e:
    #    pass
    finally:
        if look :
            look.end();
   
   







分享到:
评论

相关推荐

    java读取纯真ip数据库

    总的来说,实现“java读取纯真ip数据库”的过程包括文件I/O操作、数据解析、数据结构选择以及查询接口的设计。通过学习和参考开源项目,我们可以更好地理解和掌握这一技术,从而在实际项目中实现高效的IP地址管理和...

    LumaQQ及IP查询一(转)

    标题 "LumaQQ及IP查询一(转)" 暗示了这个压缩包可能包含一个与QQ相关的IP...通过对LumaQQ和IP查询工具的深入学习,可以增强对网络通信、数据处理和软件开发的理解,特别是对于那些对IP定位和网络监控感兴趣的IT从业者。

    Java读取纯真IP数据库定位IP地址(eclipse中直接使用)_项目源码

    1. **文件读取**:Java的`java.io`包提供了多种读取文件的方法,如`BufferedReader`或`Scanner`。在`IPSeeker`中,可能使用这些类来逐行读取纯真IP数据库的文本文件。 2. **数据解析**:纯真IP数据库的格式通常是每...

    lumaQQ_jar包

    XML常用于数据交换和配置文件,这个jar包可能包含了定义lumaQQ数据格式和交互规则的规范。 3. "jql_protocol.jar" 和 "jql_net.jar" - 这两个文件名暗示了与“Java QQ Protocol”(JQL协议)和网络通信有关。"jql_...

    LumaQQ LIB库文件

    LumaQQ源码,lib文件.(说明:这是我付源码的一个lib库.里面有swt的相关类库和部分公用库文件.如果你下载了我上传的LumaQQ源码,那么请下载该类库.以便能正常的运行.) 如有问题.请访问我的空间.查看相关操作.

    用于安装lumaqq的脚本文件

    这个压缩包文件包含了用于安装LumaQQ的脚本,是用户在非标准或者自定义环境中部署LumaQQ的关键步骤。以下是关于LumaQQ安装脚本及相关知识点的详细说明: 1. **LumaQQ介绍**:LumaQQ是由社区开发者维护的一款开源QQ...

    LumaQQ.NET原代码

    1. **网络通信**:LumaQQ.NET 使用.NET Framework的网络编程接口,如Socket类,来实现TCP/IP通信。TCP确保了数据的可靠传输,而Socket则提供了低级别的网络连接控制。开发者可以从中学习到如何建立和管理网络连接,...

    lumaqq for android demo

    LumaQQ的核心在于实现即时通讯功能,这通常涉及到TCP/IP协议、Socket编程和消息序列化等技术。开发者需要理解腾讯的通讯协议,以便正确地建立和维护与服务器的连接,以及发送和接收数据。在Android环境下,考虑到...

    lumaQQ 带jre的

    【压缩包子文件的文件名称列表】"LumaQQ"表示压缩包内的主要文件或程序可能就叫"LumaQQ",这通常是软件的可执行文件或者安装程序。解压后,用户可以找到并运行这个文件来启动LumaQQ实用版。 知识点详解: 1. **...

    qq机器人lumaqq.net

    在这个压缩包文件中,我们可以找到关于LumaQQ的相关代码和资源。 LumaQQ的主要特性包括: 1. **易用性**:LumaQQ通过简洁的API设计,使得开发者可以快速上手,编写出功能丰富的QQ机器人。 2. **模块化**:项目采用...

    LumaQQ SRC+LIB.zip

    其次,库(LIB)文件包含了LumaQQ运行所依赖的各种外部组件。这些库可能包括: 1. **第三方SDK**:例如,可能包含社交登录(如微信、QQ、微博)的SDK,广告平台SDK,地图SDK等。 2. **开源库**:LumaQQ可能使用了...

    lumaqq代码

    它使用了TCP/IP协议进行数据传输,这是所有网络应用程序的基础。在源码中,我们可以看到如何构建Socket连接,发送和接收数据包,以及如何处理网络异常。此外,对于QQ特有的消息协议,如TCP心跳包、数据加密解密等,...

    纯真IP地址查询(Java版源代码)

    描述还提到了“直接替换掉QQWry.dat就可以更新数据”,这表明该项目使用了一个名为QQWry.dat的特定数据文件来存储IP地址和地理位置信息。当需要更新数据库时,用户只需要替换这个文件,无需更改程序本身,体现了设计...

    LumaQQ.NET

    1. **网络通信**:LumaQQ.NET需要实现用户间的实时消息传递,这涉及到网络编程,可能使用TCP/IP协议进行数据传输。为了实现可靠的消息传递,项目可能采用了长连接或者WebSocket技术。 2. **多线程处理**:为了确保...

    LumaQQ.Net(VS2005).rar

    LumaQQ.Net的源码揭示了如何使用TCP/IP协议进行数据传输,以及如何实现心跳机制、断线重连等功能。 4. **XML序列化与反序列化**:在即时通讯中,消息通常以XML格式进行编码和解码。源码可能包含如何使用.NET ...

    LumaQQ.rar_LumaQQ_LumaQQ-Android_PortGateFacto

    2. **即时通讯协议**:LumaQQ作为一款聊天应用,会涉及TCP/IP、HTTP或其他网络通信协议,以及可能的自定义通讯协议。开发者可能会使用XMPP(Extensible Messaging and Presence Protocol)或其他类似协议来实现消息...

    LumaQQ.rar_LumaQQ

    4. **其他资源**:除了上述部分,压缩包可能还包含其他辅助文件,如配置文件、测试数据、依赖库等。这些资源对于项目的运行和调试都是必不可少的。 学习LumaQQ,你需要具备一定的编程基础,尤其是与项目相关的语言...

    lumaQQ.rar_LumaQQ_java qq_luma_lumaqqjava_qqlu

    `xml`目录可能包含了其他的XML配置文件或数据文件,这些文件可能与应用程序的设置、用户界面布局或者其他特定功能有关。XML的灵活性使其成为存储和传输配置数据的常用格式。 通过开源,LumaQQ项目提供了一个学习和...

    lumaqq.rar_lumaqq ja_群发

    2. "lumaqq" - 这可能是LumaQQ程序的主文件,可能包含源代码、编译后的类文件,或者是可执行文件。如果它是源代码,那么用户可以查看和学习如何实现QQ群发;如果是编译后的文件,用户可以直接运行以使用LumaQQ的功能...

Global site tag (gtag.js) - Google Analytics