日期:2011-08-26  浏览次数:21006 次

数据库使用的纯真数据库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"].T