Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1364415
  • 博文数量: 704
  • 博客积分: 10140
  • 博客等级: 上将
  • 技术积分: 6230
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-15 20:41
文章分类

全部博文(704)

文章存档

2013年(1)

2012年(16)

2011年(536)

2010年(151)

分类: LINUX

2010-11-19 10:01:42

出于各种需要及目的,有时候需要把IP算成整数,有是有需要将整数换算为IP原码。下面列出简单的公式供参考 :

1.IP地址转整数

    假设IP地址为192.168.1.1

   Int64 sIP=192*256*256*256+168*256*256+1*256+1

2.整数转IP原码

   假设3232235777

   还原为 IP1.IP2.IP3.IP4

    Int64 IP1=3232235777/(256*256*256)

    Int64 IP2=(3232235777-IP1*(256*256*256))/(256*256)

    Int64 IP3=(3232235777-IP1*(256*256*256)-IP2*(256*256))/256

     Int64 IP4=3232235777- IP1*(256*256*256)-IP2*(256*256)-IP3*256

请注意:

1.上述变量均定义为整数64位,是因为数据较大,32位整型会超出范围。

2.上述语法是使用c#编写,如果使用其他语言,在方法2中使用取整函数后给变量赋值

 
 
string   s= "192.168.0.1 ";
string[]   s1=s.Split(new   char[]{ '. '});
int   IP=0;
for(int   i=3;i> =0;i--)
{
IP+=Convert.ToInt32(s1[3-i])*(256^i);
}
 
 
 
用16进制计算地址,如:211.160.23.255 转换成 3550484479

CREATE OR REPLACE FUNCTION fn_ipaddr_to_num (p_ipaddr VARCHAR2)
    RETURN NUMBER
IS
    v_ret NUMBER := 0;
    k INT := 3;
    j INT := 0;
    i INT := 1;
    len INT := 0;
    len1 INT := 0;
    str VARCHAR2 (4000);
    str_split ty_str_split := ty_str_split ();
BEGIN
    len := LENGTH (p_ipaddr);

    IF p_ipaddr IS NULL OR len = 0
    THEN
        RETURN 0;
    ELSE
        WHILE j < len
        LOOP
            j := INSTR (p_ipaddr, '.', i);

            IF j = 0
            THEN
                j := len;
                str := SUBSTR (p_ipaddr, i);
                v_ret := v_ret + (TO_NUMBER (str) * POWER (256, k));

                IF i >= len
                THEN
                    EXIT;
                END IF;
            ELSE
                str := SUBSTR (p_ipaddr, i, j - i);
                i := j + 1;
                v_ret := v_ret + (TO_NUMBER (str) * POWER (256, k));
            END IF;

            k := k - 1;
        END LOOP;
    END IF;

    RETURN v_ret;
EXCEPTION
WHEN OTHERS
THEN
    RAISE;
END fn_ipaddr_to_num;
/

 

 

现在通过程序屏蔽一个ip还是比较简单的,若要屏蔽一个ip段则相对复杂一点,而且字符串的范围比较总给人感觉有点别扭,其实现在很多统计ip真实地址的数据库都是记录的ip转换为整数的值,我们同样可以使用该思路来时间简单的屏蔽ip段功能,下面我们使用asp.net来实现:

.net的IPAddress类提供的GetAddressBytes()方法可以得到IP的4个段的值,我们需要自己写一个方法来把它转化为整数,该方法如下:

// 将ip转换为对应的整数
public static long IpToLong(IPAddress ip)
{

    int x = 3;

    long o = 0;

    foreach (byte f in ip.GetAddressBytes())

    {

        o += (long)f << 8 * x--;

    }

    return o;

}

// 调用方式:
   IPAddress.Parse("127.0.0.1").IpToLong(); // 得到2130706433
   IPAddress.Parse("127.0.0.2").IpToLong(); // 得到2130706434

看到了吗,得到了两个连续的整数,只要我们把开始的ip和结束ip对应的整数存入数据库中,以后就可以轻松判断来访ip是不是在屏蔽的范围啦。

下面在提供一个将整数转换为对应ip的函数:
public static IPAddress LongToIp(long l)

{

    var b = new byte[4];

    for (int i = 0; i < 4; i++)

    {

        b[3 - i] = (byte)(l >> 8 * i & 255);

    }

    return new IPAddress(b);

}

阅读(1113) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-11-20 16:52:36

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com