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]
相关文章推荐
- C#读取纯真IP数据库的代码
- C#读取纯真IP数据库的代码
- C# 读取纯真IP数据库QQWry.dat获取地区信息
- C#读取QQ纯真IP数据库QQWry.Dat的代码
- C#读取纯真IP数据库的代码
- C#读取QQ纯真IP数据库
- 【转】C#读取QQ纯真IP数据库中的数据
- C#读取纯真IP数据库
- C# 读取纯真IP数据库QQWry.dat获取地区信息
- Python读取纯真IP数据库
- 一个类似纯真IP数据库的存储和读取程序
- 读取纯真IP数据库的公用组件QQWry.NET
- php读取纯真ip数据库使用示例
- PHP读取纯真IP数据库的函数
- delphi读取纯真IP数据库
- C#如何读取QQ纯真IP数据库
- 纯真IP数据库查询(C#源代码)
- MFC读取纯真IP数据库
- 纯真IP数据库格式读取方法(JAVA/PHP/Python)
- Discuz 5.0 中读取纯真IP数据库函数分析