zoukankan      html  css  js  c++  java
  • 利用C#导出QQWry.Dat中IP地址到其他文件

    /**//****************************************************************** 
    ** File Name:IPExport.cs 
    ** Copyright (c) 2004-2005 PPTech Studio(PPTech.Net) 
    ** Creater:Rexsp(MSN:yubo@x263.Net) 
    ** Create Date:2004-12-29 20:10:28 
    ** Modifier: 
    ** Modify Date: 
    ** Description:to export the ip location from qqwry.dat 
    ** Version: IPExport 1.0.0 
    ******************************************************************/ 
    using System; 
    using System.Collections; 
    using System.Data; 
    using System.IO; 
     
    namespace PPTech.ESP.Component 

        /**//// <summary> 
        /// ExportData 的摘要说明。 
        /// </summary> 
        public class IPExport 
        { 
            私有成员#region 私有成员 
            private string country; 
            private string local; 
            private FileStream objfs = null; 
            private long startIp=0; 
            private long endIp=0; 
            private int countryFlag=0; 
            private long endIpOff=0; 
            #endregion 
             
            构造函数#region 构造函数 
            public IPExport() 
            { 
                // 
                // TODO: 在此处添加构造函数逻辑 
                // 
            } 
            #endregion 
     
            导出数据#region 导出数据 
            public void SaveToText(string toFilePath,string fromFilePath) 
            { 
                objfs =  new FileStream(fromFilePath, FileMode.Open, FileAccess.Read); 
                objfs.Position=0;  [Page]
                byte[] buff1 = new Byte[8] ; 
                objfs.Read(buff1,0,8); 
                int firstStartIp=buff1[0]+buff1[1]*256+buff1[2]*256*256+buff1[3]*256*256*256; 
                int lastStartIp=buff1[4]*1+buff1[5]*256+buff1[6]*256*256+buff1[7]*256*256*256; 
                long recordCount=Convert.ToInt64((lastStartIp-firstStartIp)/7.0); 
                if(recordCount<=1) 
                { 
                    country=\"FileDataError\"; 
                    objfs.Close(); 
                } 
                long rangE=recordCount; 
                StreamWriter writer=File.AppendText(toFilePath); 
                for(int i=0;i<=recordCount;i++) 
                { 
                    long offSet = firstStartIp+i*7; 

                    objfs.Position=offSet; 
                 
                    byte [] buff = new Byte[7]; 
                    objfs.Read(buff,0,7); 
     
                    endIpOff=Convert.ToInt64(buff[4].ToString())+Convert.ToInt64(buff[5].ToString())*256+Convert.ToInt64(buff[6].ToString())*256*256; 
                    startIp=Convert.ToInt64(buff[0].ToString())+Convert.ToInt64(buff[1].ToString())*256+Convert.ToInt64(buff[2].ToString())*256*256+Convert.ToInt64(buff[3].ToString())*256*256*256; 
                     
                    objfs.Position=endIpOff;  [Page]
                    byte [] buff3 = new Byte[5]; 
                    objfs.Read(buff3,0,5); 
                    this.endIp=Convert.ToInt64(buff3[0].ToString())+Convert.ToInt64(buff3[1].ToString())*256+Convert.ToInt64(buff3[2].ToString())*256*256+Convert.ToInt64(buff3[3].ToString())*256*256*256; 
                    this.countryFlag=buff3[4]; 
                    string showIP=this.IntToIP(startIp); 
                    this.GetCountry(); 
                    writer.WriteLine(showIP+\" \"+this.country+this.local); 
                } 
                writer.Close(); 
     
            } 
            #endregion 
     
            int转换成IP#region int转换成IP 
            private string  IntToIP(long ip_Int) 
            { 
                long seg1=(ip_Int&0xff000000)>>24; 
                if(seg1<0) 
                    seg1+=0x100; 
                long seg2=(ip_Int&0x00ff0000)>>16; 
                if(seg2<0) 
                    seg2+=0x100; 
                long seg3=(ip_Int&0x0000ff00)>>8; 
                if(seg3<0) 
                    seg3+=0x100; 
                long seg4=(ip_Int&0x000000ff); 
                if(seg4<0) 
                    seg4+=0x100;  [Page]
                string ip=seg1.ToString()+\".\"+seg2.ToString()+\".\"+seg3.ToString()+\".\"+seg4.ToString(); 
     
                return ip; 
            } 
            #endregion 
             
            获取国家/区域偏移量#region 获取国家/区域偏移量 
            private string GetCountry() 
            { switch(this.countryFlag) 
                { 
                    case 1: 
                    case 2: 
                        this.country=GetFlagStr(this.endIpOff+4); 
                        this.local=( 1 == this.countryFlag )?\" \":this.GetFlagStr(this.endIpOff+8); 
                        break; 
                    default: 
                        this.country=this.GetFlagStr(this.endIpOff+4); 
                        this.local=this.GetFlagStr(objfs.Position); 
                        break; 
                } 
                return \" \"; 
            } 
            #endregion 
     
            获取国家/区域字符串#region 获取国家/区域字符串 
            private string GetFlagStr(long offSet) 
            { 
                int flag=0; 
                byte [] buff = new Byte[3];  [Page]
                while(1==1) 
                { 
                    //objfs.Seek(offSet,SeekOrigin.Begin); 
                    objfs.Position=offSet; 
                    flag = objfs.ReadByte(); 
                    if(flag==1||flag==2) 
                    { 
                        objfs.Read(buff,0,3); 
                        if(flag==2) 
                        { 
                            this.countryFlag=2; 
                            this.endIpOff=offSet-4; 
                        } 
                        offSet=Convert.ToInt64(buff[0].ToString())+Convert.ToInt64(buff[1].ToString())*256+Convert.ToInt64(buff[2].ToString())*256*256; 
                    } 
                    else 
                    { 
                        break; 
                    } 
                } 
                if(offSet<12) 

                   return \" \"; 
                objfs.Position=offSet; 
                return GetStr(); 
            }  [Page]
            #endregion 
     
            GetStr#region GetStr 
            private string GetStr() 
            { 
                byte lowC=0; 
                byte upC=0; 
                string str=\"\"; 
                byte[] buff =  new byte[2]; 
                while(1==1) 
                { 
                    lowC= (Byte)objfs.ReadByte(); 
                    if(lowC==0) 
                        break; 
                    if(lowC>127) 
                    { 
                        upC=(byte)objfs.ReadByte(); 
                        buff[0]=lowC; 
                        buff[1]=upC; 
                        System.Text.Encoding enc = System.Text.Encoding.GetEncoding(\"GB2312\"); 
                        str+=enc.GetString(buff); 
                    } 
                    else 
                    { 
                        str+=(char)lowC; 
                    } 
                } 
                return str;  [Page]
            }     
            #endregion 
        } 

     

    调用方式: 

                测试导出IP地址库#region 测试导出IP地址库 
                IPExport exp = new IPExport(); 
                string toFile = @\"D:\\Work\\PPTechStudio\\ip.txt\"; 
                string fromFile=@\"E:\\个人资料\\IMTools\\QQwryUpdate\\QQWry.Dat\"; 
                exp.SaveToText(toFile,fromFile); 
                #endregion 

    下载CS文件:https://files.cnblogs.com/rexsp/IPExport.rar 

  • 相关阅读:
    消息中间件(一)MQ详解及四大MQ比较
    SIP协议
    PAT (Basic Level) Practice 1008 数组元素循环右移问题
    LeetCode-Algorithms 1. 两数之和
    PAT (Basic Level) Practice 1040 有几个PAT
    PAT (Basic Level) Practice 1023 组个最小数
    PAT (Basic Level) Practice 1021 个位数统计
    PAT (Basic Level) Practice 1007 素数对猜想
    PAT (Basic Level) Practice 1006 换个格式输出整数
    PAT (Basic Level) Practice 1004 成绩排名
  • 原文地址:https://www.cnblogs.com/rooney/p/1362246.html
Copyright © 2011-2022 走看看