关于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地址转换成十进制的操作封装成一个方法,方便直接调用:

  1. /// <summary>
  2. /// IP地址转换成数字
  3. /// </summary>
  4. /// <param name="addr">IP地址</param>
  5. /// <returns>数字,输入无效IP地址返回0</returns>
  6. private static uint IPToID(string addr)
  7. {
  8. if (!IPAddress.TryParse(addr, out var ip))
  9. {
  10. return 0;
  11. }
  12. byte[] bInt = ip.GetAddressBytes();
  13. if (BitConverter.IsLittleEndian)
  14. {
  15. Array.Reverse(bInt);
  16. }
  17. return BitConverter.ToUInt32(bInt, 0);
  18. }
  1. /// <summary>
  2. /// 判断IP地址在不在某个IP地址段
  3. /// </summary>
  4. /// <param name="input">需要判断的IP地址</param>
  5. /// <param name="begin">起始地址</param>
  6. /// <param name="ends">结束地址</param>
  7. /// <returns></returns>
  8. public static bool IpAddressInRange( string input,string begin,string ends)
  9. {
  10. uint current = IPToID(input);
  11. return current>=IPToID(begin)&&current<=IPToID(ends);
  12. }

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

参考代码:

https://github.com/ldqk/Masuit.Tools/blob/f4299bf368e103c5d0e6c1c682f2efaae687752c/Masuit.Tools/Extensions.cs#L926

[C#]判断一个IP是否在某个IP段内的更多相关文章

  1. python实现判断一个字符串是否是合法IP地址

    #!usr/bin/env python #encoding:utf-8 ''''' __Author__:沂水寒城 功能:判断一个字符串是否是合法IP地址 ''' import re def jud ...

  2. 判断一个字符串是否是合法IP地址

    # -*- coding: utf-8 -*- """ @File:test06_判断ip地址是否合法.py @E-mail:364942727@qq.com @Time ...

  3. 判断一个字符串是否为合法IP

    输入任意一个字符串,判断是否为合法IP bool IsIPAddress(const char * str){ //先判断形式是否合法, //检查是否只包含点和数字 ; str[i] != '\0'; ...

  4. 判断一个字符串是否为有效ip地址

    bool f (const char *s) { int s1,s2,s3,s4; ) { return false; } if ((s1 & 0xffffff00) || (s2 & ...

  5. Spring Data MongDB空间索引(判断一个点Point是否在一个区域Polygon内)

    这里要连接MongoDB数据库,在配置文件里:spring.data.mongodb.uri = mongodb://root:root@localhost:27017/happy 两个root分别是 ...

  6. Python 射线法判断一个点坐标是否在一个坐标区域内

    class Point: lng = '' lat = '' def __init__(self, lng, lat): self.lng = lng self.lat = lat # 求外包矩形 d ...

  7. 判断一个坐标点是否在封闭曲线内的方法(swift)

    //用playground运行即可 import UIKit var str = "Hello, playground" let lTestPointsOne : [(Double ...

  8. 判断IP地址是否在指定范围内的方法

    比如给定一个ip段:127.0.0.1 ~ 127.0.0.255,我们想判断一个给定的ip地址是否在此段内,可以先将ip地址转换成整数,然后整数比较大小就很容易了. 例如: 127.0.0.1 = ...

  9. 判断一个字符串是不是一个合法的IP地址

    最近在笔试的时候遇到碰一道算法题, 要求判断一个字符串是不是合法的ip地址. 将我的思路发出来分享一下,不一定正确,也不一定是最优的方法.希望能分享一些交流 要求用java或者c来实现,我的java代 ...

  10. 判断一个IP地址是否是本局域网内地址

    //        /// <summary>        /// 判断一个IP地址是否是本局域网内地址,是返回true 否则返回false,        /// </summa ...

随机推荐

  1. 教你铁威马NAS中如何进行阵列升级

    磁盘阵列 (RAID) 是磁盘阵列的管理工具.当TNAS 中安装的硬盘多于1个时,组建适当的磁盘阵列能提高硬盘的存储效率,提高数据的安全性. 磁盘阵列升级,比如,将原来是RAID 0 或者RAID 1 ...

  2. 第一篇:前端基础之HTML

    HTML介绍 Web服务本质 import socket sk = socket.socket() sk.bind(("127.0.0.1", 8080)) sk.listen(5 ...

  3. c++随笔测试(Corner of cpp)

    在c++17下,程序的输出是什么?(有可能编译出错,有可能输出未知,有可能是未定义行为) 点击查看代码 #include<iostream> void foo(unsigned int) ...

  4. vulnhub靶场之GROTESQUE: 3.0.1

    准备: 攻击机:虚拟机kali.本机win10. 靶机:Grotesque: 3.0.1,下载地址:https://download.vulnhub.com/grotesque/grotesque3. ...

  5. C语言读写txt文件

    写入和读取txt文件 #include<stdio.h> #include<string.h> int main( int argc, char *argv[] ) { int ...

  6. 2022年7月13日,第四组,周鹏,JS做计算器代码

    代码不难,看了我前面笔记的应该能看懂. 没看?(= ̄ω ̄=)喵了个咪(๑‾᷅^‾᷅๑) 嫌弃你 还看啥,去看啊!要不直接复制代码吧!( ̄へ ̄)( ̄へ ̄)( ̄へ ̄) Document 0 / * - 7 ...

  7. [常用工具] Caffe ssd常见问题集合

    1 Check failed: a <= b <0 vs -1.19209e-007> 网上办法是注释掉 CHECK_LE(a, b),但是这样会出大问题.解决办法见2. 如果注释掉 ...

  8. HBase详解(04) - HBase Java API使用

    HBase详解(04) - HBase Java API使用 环境准备 新建Maven项目,在pom.xml中添加依赖 <dependency> <groupId>org.ap ...

  9. 使用动态输出打印内核的DEBUG信息

    简介 printk()是很多嵌入式开发者喜欢用的调试手段之一,但是,使用printk()每次都要重新编译内核,很不方便.使用动态输出在不需要重新编译内核的情况下,方便的打印出内核的debug信息. 要 ...

  10. Flutter踩坑日记,自己挖的坑,哭着也要走出来。

    1. 系统运行缓慢,疯狂点击右上角小X,再次启动后Emulator启动黑屏,关机重启也不好使,其他 Emulator也无法使用. 执行以下步骤: 第一检查内存是否够用 啊  不够用了 那么 [解决方法 ...