[C#]判断一个IP是否在某个IP段内
2024-10-14 08:43:05
关于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
最新文章
- [转载]:STM32为什么必须先配置时钟再配置GPIO
- 内置对象Global和Math对象
- 薛非《品悟C-抛弃C程序设计中的谬误与恶习》读后感part1【转】
- WEB/HTTP 调试利器 Fiddler 的一些技巧分享
- Java面试之SE基础基本数据类型
- [HDOJ5521]Meeting(最短路)
- Topcoder 练习小记,Java 与 Python 分别实现。
- mysql数据库容量查询
- Python算法之---冒泡,选择,插入排序算法
- Raspberrypi安装使用开发简要说明
- struts2---自定义类型转换器
- Leetcode题解(一)
- Kafka详细配置
- Batch入门教程丨第二章:认识变量相关概念
- [bzoj1563][诗人小g]
- 扁平数组构建DOM树
- trajan
- python学习:数据类型
- python中关于类隐藏属性的三种处理方法
- MySQL的sql_mode模式说明及设置
热门文章
- 配置php-fpm识别php文件访问
- uniapp 微信小程序-点击图片放大图片
- JavaScript:对象:如何读取、添加、删除对象的属性?
- 含辞未吐,声若幽兰,史上最强免费人工智能AI语音合成TTS服务微软Azure(Python3.10接入)
- C++进阶(unordered_set+unordered_map模拟实现)
- 【好软推荐】Scoop - Windows快速软件安装指南
- 微软拼音长句模式恢复工具支持Win10 1803
- B. Quick Sort【Codeforces Round #842 (Div. 2)】
- P7368 [USACO05NOV]Asteroids G
- Joplin修改笔记存储位置