首页 > 其他分享 >根据IP和子网掩码取IP段(CIDR)

根据IP和子网掩码取IP段(CIDR)

时间:2022-10-12 11:11:42浏览次数:49  
标签:Console IP 192.168 WriteLine ip var CIDR 子网掩码 UInt32

一般做风控会对公司的外网IP加白,如果公司的分公司比较多,一般公司的网络工程师会把这些ip以CIDR的格式记录起来,

什么是CIDR的格式呢,比如:192.168.0.62/30

这里面 192.168.0.62代表的是主机地址 /30代表的是子网掩码

那根据192.168.0.62/30怎么取到实际的IP段呢?

第一步: /30 怎么把子网掩码转成我们熟悉的格式是255.255.255.xx

①255.255.255.255       对应的是 =》        11111111.11111111.11111111.11111111
②那么 /30 代表的是 前面30个全是1 =》   11111111.11111111.11111111.11111100
③192.168.0.62          对应的是 =》           11000000.10101000.00000000.00111110

接下来 ②和③做与运算
11111111.11111111.11111111.11111100

11000000.10101000.00000000.00111110
等于
11000000.10101000.00000000.00111110 也就是192.168.0.60

 

!!注意看标黄色的,因为②的前32位都是1,也就是说ip段可以变的就是后面2位了

得出:

最小:11000000.10101000.00000000.00111100  也就是主机地址 192.168.0.60

最大:  11000000.10101000.00000000.00111111 也就是广播地址 192.168.0.63

得出结果可用的ip段为 >192.168.0.60 <192.168.0.63
也就是2个
192.168.0.61
192.168.0.62

 

那根据代码如何拿快速获取呢

 



class IPSegment
{
	private UInt32 _ip;
	private UInt32 _mask;
	public IPSegment (string ipMask)
	{
		var arr = ipMask.Split ('/');
		_ip = arr [0].ParseIp();
		var mask = Int32.Parse(arr[1]);
		var mask1 = 32 - mask;
		var mask2 = new String('0',2);
		var mask3 = new String('1',8-mask1);
		var realMask = "255.255.255." + Convert.ToInt32(mask3+mask2, 2);
		_mask =realMask.ParseIp();
	}

	public IPSegment (string ip, string mask)
	{
		_ip = ip.ParseIp();
		_mask = mask.ParseIp();
	}
	public UInt32 NumberOfHosts { get { return ~_mask + 1; } }
	public UInt32 NetworkAddress { get { return _ip & _mask; } }
	public UInt32 BroadcastAddress { get { return NetworkAddress + ~_mask; } }
	public IEnumerable<UInt32> Hosts()
	{
		for (var host = NetworkAddress + 1; host < BroadcastAddress; host++)
		{
			yield return host;
		}
	}
}
static class IpHelpers
{
	public static string ToIpString (this UInt32 value)
	{
		var bitmask = 0xff000000;
		var parts = new string [4];
		for (var i = 0; i < 4; i++)
		{
			var masked = (value & bitmask) >> ((3 - i) * 8);
			bitmask >>= 8;
			parts [i] = masked.ToString (CultureInfo.InvariantCulture);
		}
		return String.Join (".", parts);
	}
	public static UInt32 ParseIp (this string ipAddress)
	{
		var splitted = ipAddress.Split ('.');
		UInt32 ip = 0;
		for (var i = 0; i < 4; i++)
		{
			ip = (ip << 8) + UInt32.Parse (splitted [i]);
		}
		return ip;
	}
}

使用方式:

 

 

IPSegment ip = new IPSegment ("192.168.0.62/30");
Console.WriteLine (ip.NumberOfHosts);
Console.WriteLine (ip.NetworkAddress.ToIpString());
Console.WriteLine (ip.BroadcastAddress.ToIpString());
Console.WriteLine ("===");
foreach (UInt32 host in ip.Hosts())
{
	Console.WriteLine (IpHelpers.ToIpString (host));
}

或者这么用

 

IPSegment ip = new IPSegment ("192.168.0.62","255.255.255.252");
Console.WriteLine (ip.NumberOfHosts);
Console.WriteLine (ip.NetworkAddress.ToIpString());
Console.WriteLine (ip.BroadcastAddress.ToIpString());
Console.WriteLine ("===");
foreach (UInt32 host in ip.Hosts())
{
	Console.WriteLine (IpHelpers.ToIpString (host));
}

 

Enjoy!!!

关注公众号一起学习

标签:Console,IP,192.168,WriteLine,ip,var,CIDR,子网掩码,UInt32
From: https://www.cnblogs.com/yudongdong/p/16783803.html

相关文章

  • IPV4和IPV6有何区别?为何IPV6没有普及?
    IP指网际互连协议,InternetProtocol的缩写,是​​TCP/IP​​体系中的网络层协议。IP是整个TCP/IP协议族的核心,也是构成互联网的基础。设计IP的目的是提高网络的可扩展性:一是......
  • 工作Tip
    1、HP1T2.5SAS硬盘P/N:653954在HPDL388GEN7 DL580gen7上不识别。原因是:这个盘本来是g8g9用的。有两个方式可以试一下把硬盘托架换一下,换成g7的托架把机器的bios更新到......
  • Python的常用库及区别——numpy、pandas、matplotlib、scipy
    1.Numpy  numpy是python科学计算的基础包,好多算法都是基于numpy构建的。其功能有:快速高效的多维数组ndarray用于对数组执行元素及计算以及直接对数组执行数字运......
  • 《MiniPRO H750开发指南》第四十九章 硬件JPEG解码实验
    第四十九章硬件JPEG解码实验​上一章,我们学习了图片解码,学会了使用软件解码显示bmp/jpg/jpeg/gif等格式的图片,但是软件解码速度都比较慢,本章我们将学习如何使用STM32H750自......
  • 《MiniPRO H750开发指南》第四十八章 图片显示实验
    第四十八章图片显示实验​在开发产品的时候,很多时候,我们都会用到图片解码,在本章中,我们将向大家介绍如何通过STM32H7来解码BMP/JPG/JPEG/GIF等图片,并在LCD上显示出来。​本章......
  • 如何解决python爬虫的ip资源问题
    解决python爬虫的ip资源需求,有以下三种方法:一.采购http代理,api提取此类方法适用于爬虫脚本或软件在本地电脑或服务器终端运行的情况,通过api提取的方式获取海量代理ip,因为ap......
  • Java对ip地址校验
    importjava.util.Scanner;publicclassip_test{/**IP的格式:(1~255).(0~255).(0~255).(0~255)**/publicstaticvoidmain(String[]args){......
  • Stream流中的常用方法_skip与Stream流中的常用方法_concat
    Stream流中的常用方法_skipskip:跳过前几个Stream流中的常用方法_skip:用于跳过元素如果希望跳过前几个元素,可以使用skip方法获取一个截取之后的新流Stream<T>skip(lo......
  • 【Bug解决】Ubuntu安装pip3:无法定位软件包问题
    转自https://zstar.blog.csdn.net/article/details/125257999最近想要使用kali里面的python3,需要pip3,结果怎么也不对。提示无法定位软件包。网上找到这一篇:参考一下。“......
  • JavaScript works behind the scenes -- Engine and Runtime
    whatisaJavaScriptengine?programthatexecutesJavaScriptcode.JavaScript引擎是运行JavaScript代码的程序。howengineworks?JavaScriptcontainsacallsta......