关于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段内的更多相关文章

  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. 数据库MySQL(完结)

    SQL注入问题 简介 针对SQL注入的攻击行为可描述为通过用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序意料之外结果的攻击行为. 其成因可归结为以下两个原理叠加造成: 程序编写者在处理 ...

  2. 万字长文解析Scaled YOLOv4模型(YOLO变体模型)

    一,Scaled YOLOv4 摘要 1,介绍 2,相关工作 2.1,模型缩放 3,模型缩放原则 3.1,模型缩放的常规原则 3.2,为低端设备缩放的tiny模型 3.3,为高端设备缩放的Large模 ...

  3. [OpenCV实战]17 基于卷积神经网络的OpenCV图像着色

    目录 1 彩色图像着色 1.1 定义着色问题 1.2 CNN彩色化结构 1.3 从 中恢复彩色图像 1.4 具有颜色再平衡的多项式损失函数 1.5 着色结果 2 OpenCV中实现着色 2.1 模型下 ...

  4. 《深度探索C++对象模型》第三章 Data语意学

    首先给出以下例子: class X{}; class Y:public virtual X{}; class Z:public virtual X{}; class A:public Y,public ...

  5. [C++标准模板库:自修教程与参考手册]关于auto_ptr

    什么是auto_ptr指针 auto_ptr是这样一种指针:它是"它所指的对象"的拥有者,所以,当身为对象拥有者的auto_ptr指针被摧毁时,该对象也会被摧毁,auto_ptr要 ...

  6. 联邦学习(Federated Learning)

    联邦学习的思想概括为:一种无需交换数据(只交换训练中间参数或结果)的分布式机器学习技术,在保护数据隐私的同时实现数据共享,解决数据孤岛问题. 本文仅介绍基本概念,详细请查看文末参考资料. 基本概念 联 ...

  7. printf()和scanf()的*修飾符

    如果你不想預先設置字段的寬度,想通過程序來進行設定,則可以可以使用"*"來進行修飾字段的寬度,前提是在程序中要包含"*"和參數對應的值(比如%*d,那麽參數應該 ...

  8. STL容器vector

    一.什么是Vector        向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container).跟任意其它类型容器一样,它能够存放各种类型的对象.可以简单的认为, ...

  9. 【Rust学习】内存安全探秘:变量的所有权、引用与借用

    作者:京东零售 周凯 一.前言 Rust 语言由 Mozilla 开发,最早发布于 2014 年 9 月,是一种高效.可靠的通用高级语言.其高效不仅限于开发效率,它的执行效率也是令人称赞的,是一种少有 ...

  10. Django中需要修改配置

    Django需要修改配置 1.修改templates中的路径配置: TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.Django ...