导出QQWry.Dat中IP地址到文件[C#]

/* ***************************************************************** 
** 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  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值