注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

海宏软件的个人主页

用机器解放人的双手

 
 
 

日志

 
 

比较一个ip地址是否在一个地址段里 findIpMatch  

2013-03-19 11:59:39|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
#region //比较一个ip地址是否在一个地址段里  findIpMatch,作者:海宏软件
        /// <summary>
        /// 传入一个ip地址、一个ip地址段字符串,取出这个ip地址在这个ip地址段的哪里,不在其中返回空
        /// </summary>
        /// <param name="sIp">要检查的ip地址,比如:192.168.88.3</param>
        /// <param name="sIpSectionsFromTo">这个字符串是用分号分隔的,格式可以是:
        /// 格式1:192.168.88.*,或者192.168.*.*,或者192.168.*.3
        /// 格式2:192.168.1.3-192.168.1.254
        /// 格式3:1.1.1.1-1.1.2.254;33.33.33.33-44.44.44.254;66.77.88.99-45.*.*.80
        /// 格式4:1.1.1.1~1.1.2.254;33.33.33.33~44.44.44.254;66.77.88.99~45.*.*.80</param>
        /// <returns></returns>
        public static string findIpMatch(string sIp, string sIpSectionsFromTo)
        {   //检查ip的匹配段
            string result = "", sFrom = "", sTo = "";
            int n = 0;
            //UInt64 nIp=0,nFrom=0, nTo=0;
            string[] sSections = sIpSectionsFromTo.Split(';');       //用分号隔开
            foreach (string sSec in sSections)
            {
                string[] sIps = sSec.Split('-', '~');               //用这个分隔开的
                if (sIps.Length < 1) continue;                      //无效
                //开始地址、结束地址
                n = sIps.Length - 1;
                sFrom = sIps[0].Trim().Replace("*", "1");           //判断是否包含*号,替换成1
                sTo = sIps[n].Trim().Replace("*", "254");           //结束地址段
                //IP地址转换成long数字,nFrom = BitConverter.ToUInt32(IPAddress.Parse(sFrom).GetAddressBytes(), 0);
                ulong nFrom = IPAddressToLong(sFrom), nTo = IPAddressToLong(sTo), nIp = IPAddressToLong(sIp);
                //比较
                if (nIp >= nFrom && nIp <= nTo) { result = sSec; break; }   //找到了这个合适的地址段
            }
            //
            return result;
        }

        /// <summary>
        /// ip地址转换成uint64无符号数字,应该是支持IP v6
        /// </summary>
        /// <param name="sIp">IP地址</param>
        /// <returns>ulong数字</returns>
        public static ulong IPAddressToLong(string sIp)
        {
            ulong result = 0;
            byte b = 0;
            //IP数组
            byte[] ips = System.Net.IPAddress.Parse(sIp).GetAddressBytes(); //分拆出数组
            //尝试过BitConverter.ToUInt32(ips, 0),发现是正序的,比如192.168.1.8,0位是192,1位是168,2位是1,3位是8
            for (int i = 0; i < ips.Length; i++)
            {
                b = ips[i];
                int n = (ips.Length - i - 1) * 8;           //倒序,每个byte是8个bit
                result = result + (ulong)(b << n);          //移位
            }
            //完成
            return result;
        }
        #endregion

  评论这张
 
阅读(504)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017