当前位置 > 首页 > Asp.net

IP to Integer

2010-2-2 7:22:00来源:Asp.net

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

转换的算法如下:

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

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

计算公式如下:
(first octet * 2563) + (second octet * 2562) + (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

调用范例:




  • .Net 4.0 Parallel 编程(九)Task中的数据共享(下)

    2011-4-21 10:51:00

    在上篇Post中我们看过了几种常用的同步类型,本篇文章会介绍下申明性的同步的实现以及对于集合类型数据共享的问题,首先看下申明性同步的实现。 申明性同步 我们可以通过使用Synchroniza

  • Net设计模式实例之访问者模式(Visitor Pattern)

    2010-1-28 13:28:00

    阅读: 448 评论: 1 作者: 灵动生活 发表于 2010-01-28 09:10 原文链接 一、访问者模式简介( Brief Intro du

  • rails与jsonp

    2010-1-5 0:52:00

    阅读: 211 评论: 0 作者: 司徒正美 发表于 2010-01-04 22:11 原文链接 涉及后台的东西,我也不敢保证对错,总之写出来如果有错望各位高人不吝赐教吧。跨域的需要大多数

  • 10分钟搞定Linq to NHibernate

    2009-10-16 5:34:00

    摘要: 在微软发布C# 3.0后, LINQ在项目中发挥了重要作用。作为3.0语言身份的象征之一,学习LINQ有为重要。而NHibernate作为运用最广的ORM框架之一,在大型项目中广受开发人员的

  • ASP.NET Membership and Role Provider - CodeProject

    2011-11-29 5:30:00

    Read More......( read more )

  • Silverlight & Blend动画设计系列一:偏移动画(TranslateTransform)

    2010-3-22 15:56:00

    阅读: 564 评论: 4 作者: Bēniaǒ 发表于 2010-03-21 22:27 原文链接   用户界面组件、图像元素和多媒体功能可以让我们的界面生动活泼,除此之外,Silv

  • ASP.NET MVC:创建 ModelBinder 自动 Trim 所有字符串

    2010-12-29 23:21:00

    用户输入的字符串前后的空格会对程序造成很大的危害,最常见的问题就是查询和统计错误。作为严谨的开发人员,我们应该主动进行处理。 逐个 Trim 相当麻烦 .NET 中为我们提供了三个字符串处理

  • 也谈测试用例

    2007-5-28 19:18:00

    【摘要】 测试用例英文名叫 Test case ,测试用例是开展测试工作的重要一项,测试用例是否完善、质量高低以及执行的情况如何是影响软件测试结果的一个重要方面。可

  • 架构 - 又一个类似与“平台”一样的词汇

    2009-12-10 22:05:00

    阅读: 0 评论: 0 作者: 快乐学习 发表于 2009-12-10 22:02 原文链接   有一阵子听到大家都在讲“平台”,但是不知道具体什么是平台,经过很多

  • 博客园电子期刊2009年9月刊发布啦

    2009-10-9 20:45:00

    摘要: 博客园电子期刊No24.2009年9月刊您是否为错过博客园精彩博文而苦苦寻找?您是否需要温故而新的机会?博客园电子期刊为您准备了这一切!为您精心挑选并整理了精彩博文! 赶快订阅吧~~博客园电