asp.net 纯真ip库取得所在地实现代码
asp.net 纯真ip库取得所在地实现代码
发布时间:2016-12-29 来源:查字典编辑
摘要:有关纯真IP库的相关知识:查看(pdf格式)纯真IP库官方下载地址:http://www.cz88.net/使用的类(已经经过调试.net2...

有关纯真IP库的相关知识:查看( pdf格式)

纯真IP库官方下载地址:http://www.cz88.net/

使用的类(已经经过调试.net 2.0,已对错误做了修改):

复制代码 代码如下:

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

using System.Text.RegularExpressions;

namespace QQWry.NET

{

public class IPLocation

{

private string _IP;

private string _Country;

private string _Local;

public string IP

{ get{return _IP;}

set{_IP = value;}

}

public string Country

{ get{return _Country;}

set{_Country = value;}

}

public string Local

{ get{return _Local;}

set{_Local = value;}

}

}

public class QQWryLocator

{

private byte[] data;

Regex regex = new Regex(@"(((d{1,2})|(1d{2})|(2[0-4]d)|(25[0-5])).){3}((d{1,2})|(1d{2})|(2[0-4]d)|(25[0-5]))");

long firstStartIpOffset;

long lastStartIpOffset;

long ipCount;

public long Count { get { return ipCount; } }

public QQWryLocator(string dataPath)

{

using (FileStream fs = new FileStream(dataPath, FileMode.Open, FileAccess.Read, FileShare.Read))

{

data = new byte[fs.Length];

fs.Read(data, 0, data.Length);

}

byte[] buffer = new byte[8];

Array.Copy(data, 0, buffer, 0, 8);

firstStartIpOffset = ((buffer[0] + (buffer[1] * 0x100)) + ((buffer[2] * 0x100) * 0x100)) + (((buffer[3] * 0x100) * 0x100) * 0x100);

lastStartIpOffset = ((buffer[4] + (buffer[5] * 0x100)) + ((buffer[6] * 0x100) * 0x100)) + (((buffer[7] * 0x100) * 0x100) * 0x100);

ipCount = Convert.ToInt64((double)(((double)(lastStartIpOffset - firstStartIpOffset)) / 7.0));

if (ipCount <= 1L)

{

throw new ArgumentException("ip FileDataError");

}

}

private static long IpToInt(string ip)

{

char[] separator = new char[] { '.' };

if (ip.Split(separator).Length == 3)

{

ip = ip + ".0";

}

string[] strArray = ip.Split(separator);

long num2 = ((long.Parse(strArray[0]) * 0x100L) * 0x100L) * 0x100L;

long num3 = (long.Parse(strArray[1]) * 0x100L) * 0x100L;

long num4 = long.Parse(strArray[2]) * 0x100L;

long num5 = long.Parse(strArray[3]);

return (((num2 + num3) + num4) + num5);

}

private static string IntToIP(long ip_Int)

{

long num = (long)((ip_Int & 0xff000000L) >> 0x18);

if (num < 0L)

{

num += 0x100L;

}

long num2 = (ip_Int & 0xff0000L) >> 0x10;

if (num2 < 0L)

{

num2 += 0x100L;

}

long num3 = (ip_Int & 0xff00L) >> 8;

if (num3 < 0L)

{

num3 += 0x100L;

}

long num4 = ip_Int & 0xffL;

if (num4 < 0L)

{

num4 += 0x100L;

}

return (num.ToString() + "." + num2.ToString() + "." + num3.ToString() + "." + num4.ToString());

}

public IPLocation Query(string ip)

{

if (!regex.Match(ip).Success)

{

throw new ArgumentException("IP格式错误");

}

IPLocation ipLocation = new IPLocation();

ipLocation.IP = ip;

long intIP = IpToInt(ip);

if ((intIP >= IpToInt("127.0.0.1") && (intIP <= IpToInt("127.255.255.255"))))

{

ipLocation.Country = "本机内部环回地址";

ipLocation.Local = "";

}

else

{

if ((((intIP >= IpToInt("0.0.0.0")) && (intIP <= IpToInt("2.255.255.255"))) || ((intIP >= IpToInt("64.0.0.0")) && (intIP <= IpToInt("126.255.255.255")))) ||

((intIP >= IpToInt("58.0.0.0")) && (intIP <= IpToInt("60.255.255.255"))))

{

ipLocation.Country = "网络保留地址";

ipLocation.Local = "";

}

}

long right = ipCount;

long left = 0L;

long middle = 0L;

long startIp = 0L;

long endIpOff = 0L;

long endIp = 0L;

int countryFlag = 0;

while (left < (right - 1L))

{

middle = (right + left) / 2L;

startIp = GetStartIp(middle, out endIpOff);

if (intIP == startIp)

{

left = middle;

break;

}

if (intIP > startIp)

{

left = middle;

}

else

{

right = middle;

}

}

startIp = GetStartIp(left, out endIpOff);

endIp = GetEndIp(endIpOff, out countryFlag);

if ((startIp <= intIP) && (endIp >= intIP))

{

string local;

ipLocation.Country = GetCountry(endIpOff, countryFlag, out local);

ipLocation.Local = local;

}

else

{

ipLocation.Country = "未知";

ipLocation.Local = "";

}

return ipLocation;

}

private long GetStartIp(long left, out long endIpOff)

{

long leftOffset = firstStartIpOffset + (left * 7L);

byte[] buffer = new byte[7];

Array.Copy(data, leftOffset, buffer, 0, 7);

endIpOff = (Convert.ToInt64(buffer[4].ToString()) + (Convert.ToInt64(buffer[5].ToString()) * 0x100L)) + ((Convert.ToInt64(buffer[6].ToString()) * 0x100L) * 0x100L);

return ((Convert.ToInt64(buffer[0].ToString()) + (Convert.ToInt64(buffer[1].ToString()) * 0x100L)) + ((Convert.ToInt64(buffer[2].ToString()) * 0x100L) * 0x100L)) + (((Convert.ToInt64(buffer[3].ToString()) * 0x100L) * 0x100L) * 0x100L);

}

private long GetEndIp(long endIpOff, out int countryFlag)

{

byte[] buffer = new byte[5];

Array.Copy(data, endIpOff, buffer, 0, 5);

countryFlag = buffer[4];

return ((Convert.ToInt64(buffer[0].ToString()) + (Convert.ToInt64(buffer[1].ToString()) * 0x100L)) + ((Convert.ToInt64(buffer[2].ToString()) * 0x100L) * 0x100L)) + (((Convert.ToInt64(buffer[3].ToString()) * 0x100L) * 0x100L) * 0x100L);

}

/// <summary>

/// Gets the country.

/// </summary>

/// <param name="endIpOff">The end ip off.</param>

/// <param name="countryFlag">The country flag.</param>

/// <param name="local">The local.</param>

/// <returns>country</returns>

private string GetCountry(long endIpOff, int countryFlag, out string local)

{

string country = "";

long offset = endIpOff + 4L;

switch (countryFlag)

{

case 1:

case 2:

country = GetFlagStr(ref offset, ref countryFlag, ref endIpOff);

offset = endIpOff + 8L;

local = (1 == countryFlag) ? "" : GetFlagStr(ref offset, ref countryFlag, ref endIpOff);

break;

default:

country = GetFlagStr(ref offset, ref countryFlag, ref endIpOff);

local = GetFlagStr(ref offset, ref countryFlag, ref endIpOff);

break;

}

return country;

}

private string GetFlagStr(ref long offset, ref int countryFlag, ref long endIpOff)

{

int flag = 0;

byte[] buffer = new byte[3];

while (true)

{

//用于向前累加偏移量

long forwardOffset = offset;

flag = data[forwardOffset++];

//没有重定向

if (flag != 1 && flag != 2)

{

break;

}

Array.Copy(data, forwardOffset, buffer, 0, 3);

forwardOffset += 3;

if (flag == 2)

{

countryFlag = 2;

endIpOff = offset - 4L;

}

offset = (Convert.ToInt64(buffer[0].ToString()) + (Convert.ToInt64(buffer[1].ToString()) * 0x100L)) + ((Convert.ToInt64(buffer[2].ToString()) * 0x100L) * 0x100L);

}

if (offset < 12L)

{

return "";

}

return GetStr(ref offset);

}

private string GetStr(ref long offset)

{

byte lowByte = 0;

byte highByte = 0;

StringBuilder stringBuilder = new StringBuilder();

byte[] bytes = new byte[2];

Encoding encoding = Encoding.GetEncoding("GB2312");

while (true)

{

lowByte = data[offset++];

if (lowByte == 0)

{

return stringBuilder.ToString();

}

if (lowByte > 0x7f)

{

highByte = data[offset++];

bytes[0] = lowByte;

bytes[1] = highByte;

if (highByte == 0)

{

return stringBuilder.ToString();

}

stringBuilder.Append(encoding.GetString(bytes));

}

else

{

stringBuilder.Append((char)lowByte);

}

}

}

}

}

使用:

复制代码 代码如下:

QQWry.NET.QQWryLocator qqWry = new QQWry.NET.QQWryLocator(Server.MapPath("QQWry.Dat"));

QQWry.NET.IPLocation ip = qqWry.Query("120.67.217.7");

Response.Write(ip.IP + "<br />");

Response.Write(ip.Country + "<br />");

Response.Write(ip.Local);

结果:

asp.net 纯真ip库取得所在地实现代码1

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新asp.net教程学习
热门asp.net教程学习
编程开发子分类