/****************************************************************** 

** 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; 

            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; 

                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; 

            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]; 

            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(); 

        } 

        #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; 

        }     

        #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 


申明

非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!