首页 > 编程语言 >C#判断一个IP是否在某个IP段内

C#判断一个IP是否在某个IP段内

时间:2023-01-29 10:44:44浏览次数:33  
标签:转换成 C# IP IP地址 二进制 32 某个 十进制

关于IP地址

IPv4地址是由4段0-255的数字组成的,例如:a.b.c.d(0≤a,b,c,d≤255),IPv4也叫32位地址,为什么是32位呢,因为把每一段转换成二进制后,它的取值范围就是00000000-11111111,所以加起来就是32位。
那么IP地址的本质是一个32位的二进制数,我们便可以将这个32位的二进制再转换成十进制,进行比较不就可以了吗?

IP地址转十进制

以4.3.2.1为例,对应的十进制是多少呢?

  • 1.转换成二进制,即00000100.00000011.00000010.00000001;
  • 2.去掉“.”,得到完整的二进制数:00000100000000110000001000000001;
  • 3.再转回十进制:00000100000000110000001000000001(2)=67305985(10);
    步骤比较繁琐,有什么更快的方法来计算这个十进制数呢?
    肯定是有的,就是移位操作,67305985=4<<24+3<<16+2<<8+1。这样就实现了IP地址转十进制的操作,即使是128位的IPv6,也是如法炮制。

判断一个IP是否在某个IP段

所以判断一个IP是否在某个IP段就直接将要对比的IP地址分别转换成十进制比大小就好了,也不用担心性能问题,因为移位操作是CPU最擅长的事情,比起加减乘除还要来的快,因此,我们将IP地址转换成十进制的操作封装成一个方法,方便直接调用:

        /// <summary>
        /// IP地址转换成数字
        /// </summary>
        /// <param name="addr">IP地址</param>
        /// <returns>数字,输入无效IP地址返回0</returns>
        private static uint IPToID(string addr)
        {
            if (!IPAddress.TryParse(addr, out var ip))
            {
                return 0;
            }

            byte[] bInt = ip.GetAddressBytes();
            if (BitConverter.IsLittleEndian)
            {
                Array.Reverse(bInt);
            }

            return BitConverter.ToUInt32(bInt, 0);
        }
       /// <summary>
        /// 判断IP地址在不在某个IP地址段
        /// </summary>
        /// <param name="input">需要判断的IP地址</param>
        /// <param name="begin">起始地址</param>
        /// <param name="ends">结束地址</param>
        /// <returns></returns>
         public static bool IpAddressInRange( string input,string begin,string ends)
        {
            uint current = IPToID(input);
            return current>=IPToID(begin)&&current<=IPToID(ends);
        }

判断一个是否在某个IP段其实就这么简单!

参考代码:
https://github.com/ldqk/Masuit.Tools/blob/f4299bf368e103c5d0e6c1c682f2efaae687752c/Masuit.Tools/Extensions.cs#L926

标签:转换成,C#,IP,IP地址,二进制,32,某个,十进制
From: https://www.cnblogs.com/tuhong/p/17071986.html

相关文章

  • 黑马程序员前端-HTML+CSS之定位(position)的应用
     前端学习笔记教程不定期更新中,传送门:​​前端HTML第一天:什么是网页?什么是HTML?网页怎么形成?​​​​黑马程序员前端-CSS入门总结​​​​黑马程序员前端-CSS之emmet语法​......
  • Luminar Neo for Mac(AI技术图像编辑软件) 1.6.3激活版
    LuminarNeo是一款AI技术图像编辑软件,采用灵活高效的AI技术,能够用来编辑各种复杂的图像,功能是极其强大的。该软件有着非常直观自由度超高的用户界面,不管是对于新手还是专业......
  • 黑马程序员前端-CSS练手之学成在线页面制作
     前端学习笔记教程不定期更新中,传送门:​​前端HTML第一天:什么是网页?什么是HTML?网页怎么形成?​​​​黑马程序员前端-CSS入门总结​​​​黑马程序员前端-CSS之emmet语法​......
  • MySQL基础:通过SQL对数据库进行CRUD
    MySQL基础今日目标:能通过SQL对数据库进行CRUD文章目录MySQL基础一、MySQL数据模型二、SQL概述2.1SQL简介2.2通用语法2.3SQL分类三、DDL:操作数据库3.1查询3.2创建数据......
  • Codeforces Global Round 1
    A  题解:倒叙枚举即可。1#include<bits/stdc++.h>2usingnamespacestd;34typedeflonglongll;5constllN=1e6+3;6llb,k,a[N];7voidSolv......
  • C语言代码之判断回文数
    #include<stdio.h>//判断是否为回文数intmain(){ inta,n,s=0; printf("inputanumber:"); scanf("%d",&a); n=a; for(;;) { s=s*10+a%10; if(a/10==0) break; a=......
  • Activiti vs. Camunda Platform vs. Apache Airflow vs. Apache Flink vs. Red Hat Pr
    Zeebe|CamundaPlatform8Docshttps://docs.camunda.io/docs/components/zeebe/zeebe-overview/ApacheAirflowvs.CamundaPlatformvs.ApacheFlink比较https:/......
  • 1.5万字长文:从 C# 入门 Kafka
    1.5万字长文:从C#入门Kafka  目录1,搭建Kafka环境安装docker-compose单节点Kafka的部署Kafka集群的部署2,Kafka概念基本概念关于Ka......
  • JDBC之封装工具类(重用性方案)
    JDBC之封装工具类(重用性方案)实际JDBC使用过程中,存在大量重复代码,例如连接和数据库和关闭数据库我们需要把传统JDBC代码重构,抽取JDBC工具类,以后连接数据库,释放资源,都......
  • PyTorch与Serverless架构结合
    PyTorch介绍2017年1月,FAIR(FacebookAIResearch)发布了PyTorch。其标志如下所示。PyTorch是在Torch基础上用Python语言重新打造的一款深度学习框架,Torch是用Lua语言打造的机......