分类: 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中使用取整函数后给变量赋值
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);
}
chinaunix网友2010-11-20 16:52:36
很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com