蝈蝈俊.net

-- 用随笔来记录自己的技术感触
随笔 - 673, 评论 - 4403, 引用 - 276

导航

关于

记录自己的技术心得

标签

每月存档

最新留言

  • Murrimhv
    Excellent work, Nice Design <a href=" http://www.wikio.com/user/arutybany/bio &q...
    by Murrimhv(匿名) on 2010/3/21 18:23:56
  • Ujyntzwf
    Hello good day <a href=" http://www.wikio.com/user/fogoido/bio ">ear...
    by Ujyntzwf(匿名) on 2010/3/21 18:23:51
  • Mthziksa
    This site is crazy :) <a href=" http://www.wikio.com/user/pebyhylaga/bio "&...
    by Mthziksa(匿名) on 2010/3/21 18:23:46
  • Akluilnq
    I love this site <a href=" http://www.wikio.com/user/acaayfuho/bio "&gt...
    by Akluilnq(匿名) on 2010/3/21 17:37:11
  • Xqyztcgn
    Best Site Good Work <a href=" http://www.wikio.com/user/tyebuosase/bio "&am...
    by Xqyztcgn(匿名) on 2010/3/21 17:37:04
  • Vkvmclso
    Hello good day <a href=" http://www.wikio.com/user/ibekeree/bio ">yo...
    by Vkvmclso(匿名) on 2010/3/21 17:37:02
  • Evdodppn
    Excellent work, Nice Design <a href=" http://www.wikio.com/user/ofoitoyr/bio &qu...
    by Evdodppn(匿名) on 2010/3/21 16:16:55
  • Tqicbtxr
    this is be cool 8) <a href=" http://www.wikio.com/user/tyebuosase/bio "&...
    by Tqicbtxr(匿名) on 2010/3/21 16:16:51
  • Gnhldnnr
    Hello good day <a href=" http://www.wikio.com/user/tyebuosase/bio ">...
    by Gnhldnnr(匿名) on 2010/3/21 16:16:48
  • Pekrnadf
    magic story very thanks <a href=" http://www.wikio.com/user/siauuqe/bio "&a...
    by Pekrnadf(匿名) on 2010/3/21 15:30:15

广告

 

有时候我们要判断某个IP是否在某个段内,如何实现呢? 一个简单办法就是把IP转换成Integer,然后判断整数是否在某个范围内就可以实现这个判断。

转换的算法如下:

比如我们要转换的IP为: 058.062.042.000

First Octet: 058
Second Octet: 062
Third Octet: 042
Fourth Octet: 000

计算公式如下:
(first octet * 256³) + (second octet * 256²) + (third octet * 256) + (fourth octet)
=  (first octet * 16777216) + (second octet * 65536) + (third octet * 256) + (fourth octet)
=  (058 * 16777216) + (062 * 65536) + (042 * 256) + (000)
=  977152512

网上有现成的服务,比如下面这个地址:

http://www.aboutmyip.com/AboutMyXApp/IP2Integer.jsp

SQL Server 的一个例子如下:

CREATE FUNCTION dbo.ipStringToInt 
( 
    @ip CHAR(15) 
) 
RETURNS INT 
AS 
BEGIN 
    DECLARE @rv INT, 
        @o1 INT, 
        @o2 INT, 
        @o3 INT, 
        @o4 INT, 
        @base INT 
 
    SELECT 
        @o1 = CONVERT(INT, PARSENAME(@ip, 4)), 
        @o2 = CONVERT(INT, PARSENAME(@ip, 3)), 
        @o3 = CONVERT(INT, PARSENAME(@ip, 2)), 
        @o4 = CONVERT(INT, PARSENAME(@ip, 1)) 
 
    IF (@o1 BETWEEN 0 AND 255) 
        AND (@o2 BETWEEN 0 AND 255) 
        AND (@o3 BETWEEN 0 AND 255) 
        AND (@o4 BETWEEN 0 AND 255) 
    BEGIN      
        SELECT @base = CASE 
            WHEN @o1 < 128 THEN 
                (@o1 * 16777216) 
            ELSE 
                -(256 - @o1) * 16777216 
            END 
     
        SET @rv = @base +  
            (@o2 * 65536) +  
            (@o3 * 256) + 
            (@o4) 
    END 
    ELSE 
        SET @rv = -1 
    RETURN @rv 
END
go

调用范例:

select dbo.ipStringToInt('058.062.042.000')

整数转换如下:

CREATE FUNCTION dbo.ipIntToString 
( 
    @ip INT 
) 
RETURNS CHAR(15) 
AS 
BEGIN 
    DECLARE @o1 INT, 
        @o2 INT, 
        @o3 INT, 
        @o4 INT 
 
    IF ABS(@ip) > 2147483647 
        RETURN '255.255.255.255' 
 
    SET @o1 = @ip / 16777216 
 
    IF @o1 = 0 
        SELECT @o1 = 255, @ip = @ip + 16777216 
 
    ELSE IF @o1 < 0 
    BEGIN 
        IF @ip % 16777216 = 0 
            SET @o1 = @o1 + 256 
        ELSE 
        BEGIN 
            SET @o1 = @o1 + 255 
            IF @o1 = 128 
                SET @ip = @ip + 2147483648 
            ELSE 
                SET @ip = @ip + (16777216 * (256 - @o1)) 
        END 
    END 
    ELSE 
    BEGIN 
        SET @ip = @ip - (16777216 * @o1) 
    END 
 
    SET @ip = @ip % 16777216 
    SET @o2 = @ip / 65536 
    SET @ip = @ip % 65536 
    SET @o3 = @ip / 256 
    SET @ip = @ip % 256 
    SET @o4 = @ip 
 
    RETURN 
        CONVERT(VARCHAR(4), @o1) + '.' + 
        CONVERT(VARCHAR(4), @o2) + '.' + 
        CONVERT(VARCHAR(4), @o3) + '.' + 
        CONVERT(VARCHAR(4), @o4) 
END
go

调用范例:

select dbo.ipIntToString(977152512)

C# 的例子如下:

using System;
using System.Net;

namespace ConsoleApplication1
{
    class Program
    {
        static long ToInt(string addr)
        {
            return BitConverter.ToInt32(IPAddress.Parse(addr).GetAddressBytes(), 0); 
        }

        static string ToAddr(long address)
        {
            return IPAddress.Parse(address.ToString()).ToString();
            // This also works: 
            // return new IPAddress((uint) IPAddress.HostToNetworkOrder( 
            //    (int) address)).ToString(); 
        }

        static void Main(string[] args)
        {
            Console.WriteLine(ToInt("64.233.187.99"));
            Console.WriteLine(ToAddr(1089059683)); 

            Console.ReadLine();
        }
    }
}

参考资料:

How should I store an IP address in SQL Server?
http://sqlserver2000.databases.aspfaq.com/how-should-i-store-an-ip-address-in-sql-server.html

How to convert an IPv4 address into a integer in C#?
http://stackoverflow.com/questions/461742/how-to-convert-an-ipv4-address-into-a-integer-in-c

打印 | 张贴于 2010-01-28 15:04:44 | Tag:.net 编程心得  技术随笔  数据库开发管理心得

留言反馈

#re:IP to Integer 编辑
测试了C#方法,好像有点问题。 修改后方法: http://www.cnblogs.com/EasyData/archive/2010/01/28/1658845.html
2010-03-09 14:19:53 | [匿名:游客]
#re:IP to Integer 编辑
IPV6呢?
2010-02-02 10:34:10 | [匿名:howie]
#re:IP to Integer 编辑
IP地址在某个网段不是通过将IP地址和掩码做个异或操作的事么?
2010-01-29 13:01:22 | [匿名:wingfeng]
#re:IP to Integer 编辑
偶曾在 CodeProject 上面看见类似的代码。
2010-01-28 15:55:47 | [匿名:abc]

发表留言

标题
姓名
邮件
主页
留言 

Powered by: Joycode.MVC引擎 0.5.2.0