[C#]判断一个IP是否在某个IP段内
关于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)&¤t<=IPToID(ends);
}
判断一个是否在某个IP段其实就这么简单!
参考代码:
https://github.com/ldqk/Masuit.Tools/blob/f4299bf368e103c5d0e6c1c682f2efaae687752c/Masuit.Tools/Extensions.cs#L926
[C#]判断一个IP是否在某个IP段内的更多相关文章
- python实现判断一个字符串是否是合法IP地址
#!usr/bin/env python #encoding:utf-8 ''''' __Author__:沂水寒城 功能:判断一个字符串是否是合法IP地址 ''' import re def jud ...
- 判断一个字符串是否是合法IP地址
# -*- coding: utf-8 -*- """ @File:test06_判断ip地址是否合法.py @E-mail:364942727@qq.com @Time ...
- 判断一个字符串是否为合法IP
输入任意一个字符串,判断是否为合法IP bool IsIPAddress(const char * str){ //先判断形式是否合法, //检查是否只包含点和数字 ; str[i] != '\0'; ...
- 判断一个字符串是否为有效ip地址
bool f (const char *s) { int s1,s2,s3,s4; ) { return false; } if ((s1 & 0xffffff00) || (s2 & ...
- Spring Data MongDB空间索引(判断一个点Point是否在一个区域Polygon内)
这里要连接MongoDB数据库,在配置文件里:spring.data.mongodb.uri = mongodb://root:root@localhost:27017/happy 两个root分别是 ...
- Python 射线法判断一个点坐标是否在一个坐标区域内
class Point: lng = '' lat = '' def __init__(self, lng, lat): self.lng = lng self.lat = lat # 求外包矩形 d ...
- 判断一个坐标点是否在封闭曲线内的方法(swift)
//用playground运行即可 import UIKit var str = "Hello, playground" let lTestPointsOne : [(Double ...
- 判断IP地址是否在指定范围内的方法
比如给定一个ip段:127.0.0.1 ~ 127.0.0.255,我们想判断一个给定的ip地址是否在此段内,可以先将ip地址转换成整数,然后整数比较大小就很容易了. 例如: 127.0.0.1 = ...
- 判断一个字符串是不是一个合法的IP地址
最近在笔试的时候遇到碰一道算法题, 要求判断一个字符串是不是合法的ip地址. 将我的思路发出来分享一下,不一定正确,也不一定是最优的方法.希望能分享一些交流 要求用java或者c来实现,我的java代 ...
- 判断一个IP地址是否是本局域网内地址
// /// <summary> /// 判断一个IP地址是否是本局域网内地址,是返回true 否则返回false, /// </summa ...
随机推荐
- js修改数组中的属性名
将数组 [{id:"1",name:"AAA"}] 修改为 ===> [{id:"1",text:"AAA",va ...
- AcWing1137. 选择最佳线路
题目传送门 题目大意 \(\qquad\)有一张有向图,可以有若干个起点,只有一个终点,求所有起点到终点的最短路中最短的一条,若所有起点都与终点不连通,则输出\(-1\) 解题思路 \(\qquad\ ...
- buuctf_Dest0g3_crypto
babyAES: 题目如下: from Crypto.Cipher import AES import os iv = os.urandom(16) key = os.urandom(16) my_a ...
- 控制台运行java
控制台执行java 新建java代码 新建一个记事本文件,将文件名改为HelloWorld.java,注意:后缀是.java. 若没有显示文件后缀,可以在资源管理器打开显示后缀,然后再次修改文件名,一 ...
- Hive详解(01) - 概念
Hive详解(01) - 概念 hive简介 Hive:由Facebook开源用于解决海量结构化日志的数据统计工具,是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类S ...
- Hash table集合-练习_计算一个字符串中每个字符出现次数
Hash table集合 java.util.Hashtable<K,V>集合implements Map<K,V>接口Hashtable:底层也是一个哈希表,是一个线程安全的 ...
- freeswitch号码黑名单
概述 freeswitch是一款简单好用的的VOIP开源软交换平台. 在客户的呼叫过程中,会遇到一些异常的号码,包括高投诉风险号码.敏感号码.特殊号码等. 在客户呼叫流程中,需要针对这些异常号码做呼叫 ...
- Javascript中0.1+0.2===0.3?怎么解决这个问题?
一.问题分析 计算机存储以二进制的方式,而0.1 在二进制中是无限循环的一个数字,所以会出现裁剪,精度丢失会出现,0.100000000000000002 === 0.1,0.200000000000 ...
- 软件设计师考试备考之UML
UML 统一建模语言是面向对象软件的标准化建模语言. 事务 结构事务 UML模型中的名称,它们通常是模型的静态部分,描述概念或物理元素 图形表示: 行为事务 UML模型中的动态部分.它们是模型中的动词 ...
- Cesium计算范围(十三)
function bounds(positions = [], expand = 0) { let minLng = 180 let minLat = 90 let maxLng = -180 let ...