亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#讀取QQ純真IP數據庫QQWry.Dat的代碼

2020-01-24 03:51:01
字體:
來源:轉載
供稿:網友

純真版QQ IP數據庫

復制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Web;
using System.Configuration;

namespace BLL
{
public class IPLocationSearch
{
private static readonly QQWry qq = new QQWry(ConfigurationManager.AppSettings["ip"] + "qqwry.dat");

public static IPLocation GetIPLocation(string ip)
{
return qq.SearchIPLocation(ip);
}
}

/*
使用方法:

例子:
BDQQ.Data.QQWry qq=new BDQQ.Data.QQWry("d://QQWry.Dat");
BDQQ.Data.IPLocation ip=qq.SearchIPLocation("127.0.0.1");//這里添寫IP地址
Console.WriteLine(ip.country);//國家
Console.WriteLine(ip.area);//地區
*/

//以下是類文件
//根據LumaQQ改寫而成.

/**/
///<summary>
/// QQWry 的摘要說明。
///</summary>
public class QQWry
{
//第一種模式
#region 第一種模式
/**/
///<summary>
///第一種模式
///</summary>
#endregion
private const byte REDIRECT_MODE_1 = 0x01;

//第二種模式
#region 第二種模式
/**/
///<summary>
///第二種模式
///</summary>
#endregion
private const byte REDIRECT_MODE_2 = 0x02;

//每條記錄長度
#region 每條記錄長度
/**/
///<summary>
///每條記錄長度
///</summary>
#endregion
private const int IP_RECORD_LENGTH = 7;

//數據庫文件
#region 數據庫文件
/**/
///<summary>
///文件對象
///</summary>
#endregion
private FileStream ipFile;

private const string unCountry = "未知國家";
private const string unArea = "未知地區";

//索引開始位置
#region 索引開始位置
/**/
///<summary>
///索引開始位置
///</summary>
#endregion
private long ipBegin;

//索引結束位置
#region 索引結束位置
/**/
///<summary>
///索引結束位置
///</summary>
#endregion
private long ipEnd;

//IP地址對象
#region IP地址對象
/**/
///<summary>
/// IP對象
///</summary>
#endregion
private IPLocation loc;

//存儲文本內容
#region 存儲文本內容
/**/
///<summary>
///存儲文本內容
///</summary>
#endregion
private byte[] buf;

//存儲3字節
#region 存儲3字節
/**/
///<summary>
///存儲3字節
///</summary>
#endregion
private byte[] b3;

//存儲4字節
#region 存儲4字節
/**/
///<summary>
///存儲4字節IP地址
///</summary>
#endregion
private byte[] b4;

//構造函數
#region 構造函數
/**/
///<summary>
///構造函數
///</summary>
///<param name="ipfile">IP數據庫文件絕對路徑</param>
#endregion
public QQWry(string ipfile)
{

buf = new byte[100];
b3 = new byte[3];
b4 = new byte[4];
try
{
ipFile = new FileStream(ipfile, FileMode.Open);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
ipBegin = readLong4(0);
ipEnd = readLong4(4);
loc = new IPLocation();
}

//根據IP地址搜索
#region 根據IP地址搜索
/**/
///<summary>
///搜索IP地址搜索
///</summary>
///<param name="ip"></param>
///<returns></returns>
#endregion
public IPLocation SearchIPLocation(string ip)
{
//將字符IP轉換為字節
string[] ipSp = ip.Split('.');
if (ipSp.Length != 4)
{
throw new ArgumentOutOfRangeException("不是合法的IP地址!");
}
byte[] IP = new byte[4];
for (int i = 0; i < IP.Length; i++)
{
IP[i] = (byte)(Int32.Parse(ipSp[i]) & 0xFF);
}

IPLocation local = null;
long offset = locateIP(IP);

if (offset != -1)
{
local = getIPLocation(offset);
}

if (local == null)
{
local = new IPLocation();
local.area = unArea;
local.country = unCountry;
}
return local;
}

//取得具體信息
#region 取得具體信息
/**/
///<summary>
///取得具體信息
///</summary>
///<param name="offset"></param>
///<returns></returns>
#endregion
private IPLocation getIPLocation(long offset)
{
ipFile.Position = offset + 4;
//讀取第一個字節判斷是否是標志字節
byte one = (byte)ipFile.ReadByte();
if (one == REDIRECT_MODE_1)
{
//第一種模式
//讀取國家偏移
long countryOffset = readLong3();
//轉至偏移處
ipFile.Position = countryOffset;
//再次檢查標志字節
byte b = (byte)ipFile.ReadByte();
if (b == REDIRECT_MODE_2)
{
loc.country = readString(readLong3());
ipFile.Position = countryOffset + 4;
}
else
loc.country = readString(countryOffset);

//讀取地區標志
loc.area = readArea(ipFile.Position);

}
else if (one == REDIRECT_MODE_2)
{
//第二種模式
loc.country = readString(readLong3());
loc.area = readArea(offset + 8);
}
else
{
//普通模式
loc.country = readString(--ipFile.Position);
loc.area = readString(ipFile.Position);
}
return loc;
}

//取得地區信息
#region 取得地區信息
/**/
///<summary>
///讀取地區名稱
///</summary>
///<param name="offset"></param>
///<returns></returns>
#endregion
private string readArea(long offset)
{
ipFile.Position = offset;
byte one = (byte)ipFile.ReadByte();
if (one == REDIRECT_MODE_1 || one == REDIRECT_MODE_2)
{
long areaOffset = readLong3(offset + 1);
if (areaOffset == 0)
return unArea;
else
{
return readString(areaOffset);
}
}
else
{
return readString(offset);
}
}

//讀取字符串
#region 讀取字符串
/**/
///<summary>
///讀取字符串
///</summary>
///<param name="offset"></param>
///<returns></returns>
#endregion
private string readString(long offset)
{
ipFile.Position = offset;
int i = 0;
for (i = 0, buf[i] = (byte)ipFile.ReadByte(); buf[i] != (byte)(0); buf[++i] = (byte)ipFile.ReadByte()) ;

if (i > 0)
return Encoding.Default.GetString(buf, 0, i);
else
return "";
}

//查找IP地址所在的絕對偏移量
#region 查找IP地址所在的絕對偏移量
/**/
///<summary>
///查找IP地址所在的絕對偏移量
///</summary>
///<param name="ip"></param>
///<returns></returns>
#endregion
private long locateIP(byte[] ip)
{
long m = 0;
int r;

//比較第一個IP項
readIP(ipBegin, b4);
r = compareIP(ip, b4);
if (r == 0)
return ipBegin;
else if (r < 0)
return -1;
//開始二分搜索
for (long i = ipBegin, j = ipEnd; i < j; )
{
m = this.getMiddleOffset(i, j);
readIP(m, b4);
r = compareIP(ip, b4);
if (r > 0)
i = m;
else if (r < 0)
{
if (m == j)
{
j -= IP_RECORD_LENGTH;
m = j;
}
else
{
j = m;
}
}
else
return readLong3(m + 4);
}
m = readLong3(m + 4);
readIP(m, b4);
r = compareIP(ip, b4);
if (r <= 0)
return m;
else
return -1;
}

//讀出4字節的IP地址
#region 讀出4字節的IP地址
/**/
///<summary>
///從當前位置讀取四字節,此四字節是IP地址
///</summary>
///<param name="offset"></param>
///<param name="ip"></param>
#endregion
private void readIP(long offset, byte[] ip)
{
ipFile.Position = offset;
ipFile.Read(ip, 0, ip.Length);
byte tmp = ip[0];
ip[0] = ip[3];
ip[3] = tmp;
tmp = ip[1];
ip[1] = ip[2];
ip[2] = tmp;
}

//比較IP地址是否相同
#region 比較IP地址是否相同
/**/
///<summary>
///比較IP地址是否相同
///</summary>
///<param name="ip"></param>
///<param name="beginIP"></param>
///<returns>0:相等,1:ip大于beginIP,-1:小于</returns>
#endregion
private int compareIP(byte[] ip, byte[] beginIP)
{
for (int i = 0; i < 4; i++)
{
int r = compareByte(ip[i], beginIP[i]);
if (r != 0)
return r;
}
return 0;
}

//比較兩個字節是否相等
#region 比較兩個字節是否相等
/**/
///<summary>
///比較兩個字節是否相等
///</summary>
///<param name="bsrc"></param>
///<param name="bdst"></param>
///<returns></returns>
#endregion
private int compareByte(byte bsrc, byte bdst)
{
if ((bsrc & 0xFF) > (bdst & 0xFF))
return 1;
else if ((bsrc ^ bdst) == 0)
return 0;
else
return -1;
}

//根據當前位置讀取4字節
#region 根據當前位置讀取4字節
/**/
///<summary>
///從當前位置讀取4字節,轉換為長整型
///</summary>
///<param name="offset"></param>
///<returns></returns>
#endregion
private long readLong4(long offset)
{
long ret = 0;
ipFile.Position = offset;
ret |= (ipFile.ReadByte() & 0xFF);
ret |= ((ipFile.ReadByte() << 8) & 0xFF00);
ret |= ((ipFile.ReadByte() << 16) & 0xFF0000);
ret |= ((ipFile.ReadByte() << 24) & 0xFF000000);
return ret;
}

//根據當前位置,讀取3字節
#region 根據當前位置,讀取3字節
/**/
///<summary>
///根據當前位置,讀取3字節
///</summary>
///<param name="offset"></param>
///<returns></returns>
#endregion
private long readLong3(long offset)
{
long ret = 0;
ipFile.Position = offset;
ret |= (ipFile.ReadByte() & 0xFF);
ret |= ((ipFile.ReadByte() << 8) & 0xFF00);
ret |= ((ipFile.ReadByte() << 16) & 0xFF0000);
return ret;
}

//從當前位置讀取3字節
#region 從當前位置讀取3字節
/**/
///<summary>
///從當前位置讀取3字節
///</summary>
///<returns></returns>
#endregion
private long readLong3()
{
long ret = 0;
ret |= (ipFile.ReadByte() & 0xFF);
ret |= ((ipFile.ReadByte() << 8) & 0xFF00);
ret |= ((ipFile.ReadByte() << 16) & 0xFF0000);
return ret;
}

//取得begin和end之間的偏移量
#region 取得begin和end之間的偏移量
/**/
///<summary>
///取得begin和end中間的偏移
///</summary>
///<param name="begin"></param>
///<param name="end"></param>
///<returns></returns>
#endregion
private long getMiddleOffset(long begin, long end)
{
long records = (end - begin) / IP_RECORD_LENGTH;
records >>= 1;
if (records == 0)
records = 1;
return begin + records * IP_RECORD_LENGTH;
}
} //class QQWry

public class IPLocation
{
public String country;
public String area;

public IPLocation()
{
country = area = "";
}

public IPLocation getCopy()
{
IPLocation ret = new IPLocation();
ret.country = country;
ret.area = area;
return ret;
}
}
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品美女久久久久av超清| 久久久久久久久久久人体| 欧美激情日韩图片| 久久久久久久色| 国产精品成人免费视频| 欧美又大又硬又粗bbbbb| 2019中文字幕全在线观看| 国产亚洲欧美日韩一区二区| 91中文精品字幕在线视频| 91亚洲精品久久久久久久久久久久| 国产精品久久久久久久久久久久| 九九热精品在线| 色综合久综合久久综合久鬼88| 中文字幕欧美视频在线| 波霸ol色综合久久| 91精品91久久久久久| 久久久久久久久中文字幕| 久久男人的天堂| 久久资源免费视频| 久久久av电影| 91精品国产综合久久香蕉| 亚洲精品少妇网址| 日韩美女免费观看| 一区二区三区国产在线观看| 国产美女高潮久久白浆| 国产精品久久久久国产a级| 91精品国产色综合久久不卡98口| 欧美性xxxx极品高清hd直播| 中文字幕亚洲图片| 免费av一区二区| 欧美小视频在线观看| 亚洲影视九九影院在线观看| 色偷偷av一区二区三区乱| 精品久久久久久中文字幕| 久久手机免费视频| 亚洲欧洲午夜一线一品| 亚洲丁香婷深爱综合| 国产91九色视频| 国产99在线|中文| 2023亚洲男人天堂| 成人免费淫片视频软件| 久久精品夜夜夜夜夜久久| 国产精品一久久香蕉国产线看观看| 久久久亚洲成人| 亚洲第一福利视频| 欧美精品在线视频观看| 亚洲白虎美女被爆操| 国产欧美日韩中文字幕在线| 欧美在线xxx| 九九精品视频在线观看| 久久国产一区二区三区| 欧美亚洲午夜视频在线观看| 有码中文亚洲精品| 日韩精品一区二区三区第95| 午夜精品一区二区三区在线播放| 日韩欧美在线视频| 精品中文字幕在线| 日韩精品极品毛片系列视频| 国产精品香蕉国产| 久久久亚洲欧洲日产国码aⅴ| 亚洲大胆人体视频| 国产精品爱久久久久久久| 日韩亚洲欧美成人| 色综合五月天导航| 亚洲精品成人久久| 欧美高清在线视频观看不卡| 欧美香蕉大胸在线视频观看| 九九热精品视频在线播放| 国产精品中文久久久久久久| 成人免费视频xnxx.com| 黑人精品xxx一区| 福利微拍一区二区| 久久亚洲影音av资源网| 国产精品www网站| 国产精品福利观看| 国产成人亚洲综合91| 久久久免费观看视频| 国产丝袜精品第一页| 国产精品久久久久不卡| 亚洲伊人成综合成人网| 九九热r在线视频精品| 中文字幕亚洲专区| 国产精品av在线播放| 成人在线免费观看视视频| 精品久久久在线观看| 久久综合久中文字幕青草| 欧美在线视频免费观看| 97精品免费视频| 欧美激情精品久久久久| 国产亚洲精品久久久| 中文国产成人精品久久一| 在线不卡国产精品| 国产精品视频999| 国产精品www网站| 欧洲午夜精品久久久| 国产精品入口夜色视频大尺度| 亚洲精品白浆高清久久久久久| 国产一区二区在线免费视频| 亚洲福利视频网站| 欧美疯狂做受xxxx高潮| 亚洲精品中文字幕av| 韩国精品久久久999| 亚洲人成网站777色婷婷| 欧美日韩国产一区二区| 国产精品综合久久久| 国产午夜精品免费一区二区三区| 久久91精品国产| 欧美成人sm免费视频| 日韩欧美亚洲一二三区| 乱亲女秽乱长久久久| 久久久久久久999| 亚洲日本aⅴ片在线观看香蕉| 亚洲经典中文字幕| 91精品久久久久久久久久久| 亚洲一区免费网站| 久久精品精品电影网| 日韩少妇与小伙激情| 久久久久久午夜| 久久久久成人精品| 久久在精品线影院精品国产| 日韩欧美在线视频观看| 欧美丝袜一区二区三区| 91国在线精品国内播放| 亚洲欧美一区二区精品久久久| 国产精品入口福利| 北条麻妃在线一区二区| 久久99热精品这里久久精品| 国产精品久久久久久久久久久久久| 91视频8mav| 亚洲无限乱码一二三四麻| 欧美日韩午夜剧场| 亚洲第一网站男人都懂| 国产精品高潮呻吟久久av野狼| 欧美亚洲成人xxx| 亚洲欧美中文在线视频| 欧美日韩福利视频| 精品视频在线播放| 亚洲精品720p| 日韩激情片免费| 欧美在线视频播放| 亚洲欧美一区二区三区久久| 国产视频亚洲精品| 日本韩国欧美精品大片卡二| 国产欧美精品久久久| 国产成人小视频在线观看| 亚洲网站在线播放| 亚洲一区二区久久久久久久| 亚洲石原莉奈一区二区在线观看| 欧美巨大黑人极品精男| 日日骚av一区| 成人黄色在线免费| 国产伦精品免费视频| 亚洲福利影片在线| 国产成人高清激情视频在线观看| 国产精品视频一区二区高潮| 亚洲精品在线不卡| 国产欧美精品日韩| 国产不卡精品视男人的天堂| 欧洲成人免费aa| 精品久久久香蕉免费精品视频| 国内精品久久久久久影视8| 欧美疯狂性受xxxxx另类| 最近中文字幕2019免费| 国产日产久久高清欧美一区|