您的位置:首页 > 数据库

C#读取纯真IP数据库

2013-09-13 21:29 435 查看
          
        分类:            
.NET        
     2007-12-28 15:37    
1308人阅读     评论(0)    
收藏    
举报    

c#bytestring数据库listencoding

 

 

[align=left]using System;[/align]
[align=left]using System.Collections.Generic;[/align]
[align=left]using System.Text;[/align]
[align=left]using System.IO;[/align]
[align=left]namespace 纯真IP数据库研究[/align]
[align=left]{[/align]
[align=left]    ///<summary>[/align]
[align=left]    /// 提供从纯真IP数据库搜索IP信息的方法;[/align]
[align=left]    /// 感谢LumaQQ提供纯真IP数据库格式文档;[/align]
[align=left]    /// ----HeDaode 2007-12-28 四川教育学院[/align]
[align=left]    ///</summary>[/align]
    public class
IPSearch
[align=left]    {[/align]
[align=left]        FileStream ipFile;[/align]
[align=left]        long ip;[/align]
[align=left]        string ipfilePath;[/align]
[align=left] [/align]
[align=left]        ///<summary>[/align]
[align=left]        /// 构造函数[/align]
[align=left]        ///</summary>[/align]
[align=left]        ///<param name="ipfilePath">纯真IP数据库路径</param>[/align]
[align=left]        public IPSearch(string ipfilePath)[/align]
[align=left]        {[/align]
           
this.ipfilePath = ipfilePath;
[align=left]        }[/align]
[align=left]        //测试[/align]
        static
void Main(string[] args)
[align=left]        {[/align]
           
string ipfilePath = @"C:/Documents and Settings/Daode/桌面/qqwry/QQWry.dat";
           
IPSearch ipSearch = new
IPSearch(ipfilePath);
           
string ip = "72.51.27.51";
           
IPSearch.IPLocation loc = ipSearch.GetIPLocation(ip);
           
Console.WriteLine("你查的ip是:{0} 地理位置:{1} {2}", ip, loc.country, loc.area);
           
Console.ReadKey();
[align=left]        }[/align]
[align=left]        ///<summary>[/align]
[align=left]        /// 地理位置,包括国家和地区[/align]
[align=left]        ///</summary>[/align]
        public struct
IPLocation
[align=left]        {[/align]
           
public string country, area;
[align=left]        }[/align]
[align=left]        ///<summary>[/align]
[align=left]        /// 获取指定IP所在地理位置[/align]
[align=left]        ///</summary>[/align]
[align=left]        ///<param name="strIP">要查询的IP地址</param>[/align]
[align=left]        ///<returns></returns>[/align]
        public
IPLocation GetIPLocation(string strIP)
[align=left]        {[/align]
[align=left]            ip = IPToLong(strIP);[/align]
            ipFile =
new FileStream(ipfilePath,
FileMode.Open, FileAccess.Read);
           
long[] ipArray = BlockToArray(ReadIPBlock());
           
long offset = SearchIP(ipArray, 0, ipArray.Length - 1) * 7 + 4;
[align=left]            ipFile.Position += offset;//跳过起始IP[/align]
[align=left]            ipFile.Position = ReadLongX(3) + 4;//跳过结束IP[/align]
[align=left] [/align]
           
IPLocation loc = new
IPLocation();
           
int flag = ipFile.ReadByte();//读取标志
           
if (flag == 1)//表示国家和地区被转向
[align=left]            {[/align]
[align=left]                ipFile.Position = ReadLongX(3);[/align]
[align=left]                flag = ipFile.ReadByte();//再读标志[/align]
[align=left]            }[/align]
           
long countryOffset = ipFile.Position;
[align=left]            loc.country = ReadString(flag);[/align]
[align=left] [/align]
           
if (flag == 2)
[align=left]            {[/align]
[align=left]                ipFile.Position = countryOffset + 3;[/align]
[align=left]            }[/align]
[align=left]            flag = ipFile.ReadByte();[/align]
[align=left]            loc.area = ReadString(flag);[/align]
[align=left] [/align]
[align=left]            ipFile.Close();[/align]
            ipFile =
null;
           
return loc;
[align=left]        }[/align]
[align=left]        ///<summary>[/align]
[align=left]        /// 将字符串形式的IP转换位long[/align]
[align=left]        ///</summary>[/align]
[align=left]        ///<param name="strIP"></param>[/align]
[align=left]        ///<returns></returns>[/align]
        public
long IPToLong(string strIP)
[align=left]        {[/align]
           
byte[] ip_bytes = new
byte[8];
           
string[] strArr = strIP.Split(new
char[] { '.' });
           
for (int i = 0; i < 4; i++)
[align=left]            {[/align]
                ip_bytes[i] =
byte.Parse(strArr[3 - i]);
[align=left]            }[/align]
           
return BitConverter.ToInt64(ip_bytes, 0);
[align=left]        }[/align]
[align=left]        ///<summary>[/align]
[align=left]        /// 将索引区字节块中的起始IP转换成Long数组[/align]
[align=left]        ///</summary>[/align]
[align=left]        ///<param name="ipBlock"></param>[/align]
[align=left]        long[] BlockToArray(byte[] ipBlock)[/align]
[align=left]        {[/align]
           
long[] ipArray = new
long[ipBlock.Length / 7];
           
int ipIndex = 0;
           
byte[] temp = new
byte[8];
           
for (int i = 0; i < ipBlock.Length; i += 7)
[align=left]            {[/align]
               
Array.Copy(ipBlock, i, temp, 0, 4);
                ipArray[ipIndex] =
BitConverter.ToInt64(temp, 0);
[align=left]                ipIndex++;[/align]
[align=left]            }[/align]
           
return ipArray;
[align=left]        }[/align]
[align=left]        ///<summary>[/align]
[align=left]        /// 从IP数组中搜索指定IP并返回其索引[/align]
[align=left]        ///</summary>[/align]
[align=left]        ///<param name="ipArray">IP数组</param>[/align]
[align=left]        ///<param name="start">指定搜索的起始位置</param>[/align]
[align=left]        ///<param name="end">指定搜索的结束位置</param>[/align]
[align=left]        ///<returns></returns>[/align]
        int SearchIP(long[] ipArray,
int start, int end)
[align=left]        {[/align]
           
int middle = (start + end) / 2;
           
if (middle == start)
               
return middle;
           
else if (ip < ipArray[middle])
               
return SearchIP(ipArray, start, middle);
           
else
               
return SearchIP(ipArray, middle, end);
[align=left]        }[/align]
[align=left]        ///<summary>[/align]
[align=left]        /// 读取IP文件中索引区块[/align]
[align=left]        ///</summary>[/align]
[align=left]        ///<returns></returns>[/align]
[align=left]        byte[] ReadIPBlock()[/align]
[align=left]        {[/align]
           
long startPosition = ReadLongX(4);
           
long endPosition = ReadLongX(4);
           
long count = (endPosition - startPosition) / 7 + 1;//总记录数
[align=left]            ipFile.Position = startPosition;[/align]
           
byte[] ipBlock = new
byte[count * 7];
[align=left]            ipFile.Read(ipBlock, 0, ipBlock.Length);[/align]
[align=left]            ipFile.Position = startPosition;[/align]
           
return ipBlock;
[align=left]        }[/align]
[align=left]        ///<summary>[/align]
[align=left]        /// 从IP文件中读取指定字节并转换位long[/align]
[align=left]        ///</summary>[/align]
[align=left]        ///<param name="bytesCount">需要转换的字节数,主意不要超过8字节</param>[/align]
[align=left]        ///<returns></returns>[/align]
[align=left]        long ReadLongX(int bytesCount)[/align]
[align=left]        {[/align]
           
byte[] _bytes = new
byte[8];
[align=left]            ipFile.Read(_bytes, 0, bytesCount);[/align]
           
return BitConverter.ToInt64(_bytes, 0);
[align=left]        }[/align]
[align=left]        ///<summary>[/align]
[align=left]        /// 从IP文件中读取字符串[/align]
[align=left]        ///</summary>[/align]
[align=left]        ///<param name="flag">转向标志</param>[/align]
[align=left]        ///<returns></returns>[/align]
[align=left]        string ReadString(int flag)[/align]
[align=left]        {[/align]
           
if (flag == 1 || flag == 2)//转向标志
[align=left]                ipFile.Position = ReadLongX(3);[/align]
           
else
[align=left]                ipFile.Position -= 1;[/align]
[align=left] [/align]
           
List<byte> list =
new List<byte>();
           
byte b = (byte)ipFile.ReadByte();
           
while (b > 0)
[align=left]            {[/align]
[align=left]                list.Add(b);[/align]
[align=left]                b = (byte)ipFile.ReadByte();[/align]
[align=left]            }[/align]
           
return Encoding.Default.GetString(list.ToArray());
[align=left]        }[/align]
[align=left]    }[/align]
[align=left]}[/align]
 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: