数据库使用的纯真数据库QQwry.Dat,6兆左右。
数据库下载地址: | |
一直想做带水印的IP签名图来着。周末闲着就动手了。ASP这方面的资料很多,就不多说了。只把算法贴上。.NET关于这方面的文章很少,我反正搜到。 .Net的现在先说说算法,过几天把做成水印图的教程发一下。
ASP版的,找到两种算法,一种是搜到的,另一种是数据库附带的一份说明(作者很厚道) 。
两种算法都贴上:
第一种算法:
引用:
function cip(sip)
tip=cstr(sip)
sip1=left(tip,cint(instr(tip,".")-1))
tip=mid(tip,cint(instr(tip,".")+1))
sip2=left(tip,cint(instr(tip,".")-1))
tip=mid(tip,cint(instr(tip,".")+1))
sip3=left(tip,cint(instr(tip,".")-1))
sip4=mid(tip,cint(instr(tip,".")+1))
if cint(sip1)<128 then
cip=cint(sip1)*256*256*256+cint(sip2)*256*256+cint(sip3)*256+cint(sip4)
else
cip=cint(sip1)*256*256*256+cint(sip2)*256*256+cint(sip3)*256+cint(sip4)-4294967296
end if
end function
这个算法,有点乱。没看懂什么意思。特别是,
引用:
if cint(sip1)<128 then
cip=cint(sip1)*256*256*256+cint(sip2)*256*256+cint(sip3)*256+cint(sip4)
else
cip=cint(sip1)*256*256*256+cint(sip2)*256*256+cint(sip3)*256+cint(sip4)-4294967296
end if
经测试,无需判断。即
cip=cint(sip1)*256*256*256+cint(sip2)*256*256+cint(sip3)*256+cint(sip4)
就可以得出正确的值。
第二种算法,这个比较简单和简洁,算法一目了然,傻子都会选这个,给注释了一下:
引用:
Function cacuIp(sIP)
On Error Resume Next
Dim srIp, aIp
srIp=0
aIp = Split(sIP,".") '截取字符串,得到数组aIp[0]到aIp[3]
If UBound(aIP)<>3 Then '如果不是正确的IP
cacuIP=0 '返回0
Exit Function '退出函数
End If
For i=0 To 3
srIp=srIp+(CInt(aIP(i))*(256^(3-i))) '每个数乘上256的3-i次幂,再把值相加
Next
cacuIp=srIp-1 '最后再减去1,就得到纯真数据库里那看不懂的一堆数了
If Err Then cacuIp=0
End Function
简单明了,偶喜欢~
OK,下面换成.NET的算法.
引用:
void ciker_ip(string IP)
{
System.Int64 ip0 = 0; //64位
string[] ip_array = IP.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries); //同ASP
for (int i = 0; i <= 3;i++ )
{
ip0 = ip0 + Convert.ToInt64(ip_array[i]) * Convert.ToInt64(Math.Pow(256, 3 - i)); //64位
}
ip0=ip0-1;
}
OK,到此,.NET算法结束了.把.NET全部代码奉上.
Web.config:
引用:
<appSettings>
<add key="access" value="Ciker_IP.mdb" />
<connectionStrings/>
IP.ASPX.CS:
添加下面的命名空间:
引用:
using System.Data.OleDb;
using System.Text;
protected void Page_Load(object sender, EventArgs e)
{
ciker_ip(Request.ServerVariables["Remote_Addr"].ToString());
}
void ciker_ip(string IP)
{
System.Int64 ip0 = 0;
string[] ip_array = IP.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i <= 3;i++ )
{
ip0 = ip0 + Convert.ToInt64(ip_array[i]) * Convert.ToInt64(Math.Pow(256, 3 - i));
}
ip0=ip0-1;
string strConnection = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=" + Server.MapPath(ConfigurationSettings.AppSettings["access"]);
OleDbConnection conn = new OleDbConnection(strConnection);
OleDbCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT pos,Detail FROM ip where StartIP<=" + ip0 + " and EndIP>=" + ip0;
conn.Open();
OleDbDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
Response.Write("你丫的IP: " + IP + "<br />");
Response.Write("IP编码: " + ip0 + "<br />");
Response.Write("地区: " + dr[0].ToString() + " " + dr[1].ToString());
}
dr.Close();
conn.Close();
}