当一个IP范围都被写成一个aaa.bbb.ccc.ddd /掩码( CIDR表示法 ),我需要计算的第一个和最后在这个范围内使用C#包括IP地址。
例:
输入:192.168.0.1/25
结果:192.168.0.1 - 192.168.0.126
当一个IP范围都被写成一个aaa.bbb.ccc.ddd /掩码( CIDR表示法 ),我需要计算的第一个和最后在这个范围内使用C#包括IP地址。
例:
输入:192.168.0.1/25
结果:192.168.0.1 - 192.168.0.126
我的好朋友亚历山德罗有一个不错的职位关于C#位运算符,您应该了解它,所以你知道该怎么做。
这是很容易的 。 如果你打破给你二进制的IP,网络地址是IP地址,所有的主机位(0的子网掩码)为0,而最后一个地址,广播地址,是所有主机位都为1。
例如:
ip 192.168.33.72 mask 255.255.255.192
11111111.11111111.11111111.11000000 (subnet mask)
11000000.10101000.00100001.01001000 (ip address)
粗体的部分是主机位(其余是网络比特)。 如果你把所有的主机位为0的IP,你得到的第一个可能的IP:
11000000.10101000.00100001.01000000 (192.168.33.64)
如果你把所有的主机位为1级的,那么你得到的最后可能的IP(又名广播地址):
11000000.10101000.00100001.01111111 (192.168.33.127)
因此,对于我的例子:
the network is "192.168.33.64/26":
Network address: 192.168.33.64
First usable: 192.168.33.65 (you can use the network address, but generally this is considered bad practice)
Last useable: 192.168.33.126
Broadcast address: 192.168.33.127
我只是张贴代码:
IPAddress ip = new IPAddress(new byte[] { 192, 168, 0, 1 });
int bits = 25;
uint mask = ~(uint.MaxValue >> bits);
// Convert the IP address to bytes.
byte[] ipBytes = ip.GetAddressBytes();
// BitConverter gives bytes in opposite order to GetAddressBytes().
byte[] maskBytes = BitConverter.GetBytes(mask).Reverse().ToArray();
byte[] startIPBytes = new byte[ipBytes.Length];
byte[] endIPBytes = new byte[ipBytes.Length];
// Calculate the bytes of the start and end IP addresses.
for (int i = 0; i < ipBytes.Length; i++)
{
startIPBytes[i] = (byte)(ipBytes[i] & maskBytes[i]);
endIPBytes[i] = (byte)(ipBytes[i] | ~maskBytes[i]);
}
// Convert the bytes to IP addresses.
IPAddress startIP = new IPAddress(startIPBytes);
IPAddress endIP = new IPAddress(endIPBytes);
反掩码(XOR用的),并将其与IP。 添加1.这将是起点范围。 或IP,掩码。 这将是结束范围。
我从网络部署位置的工作得知这个快捷方式。 它帮助了我这么多,我想我会分享这个秘密跟大家。 到目前为止,我还没有能够找到一个更简单的方法在网上,我知道的。
例如网络192.115.103.64 / 27,什么范围内?
只记得子网掩码为0,128,192,224,240,248,252,254,255
255.255.255.255 11111111.11111111.11111111.11111111 / 32
255.255.255.254 11111111.11111111.11111111.11111110 / 31
255.255.255.252 11111111.11111111.11111111.11111100 / 30
255.255.255.248 11111111.11111111.11111111.11111000 / 29
255.255.255.240 11111111.11111111.11111111.11110000 / 28
255.255.255.224 11111111.11111111.11111111.11100000 / 27
255.255.255.192 11111111.11111111.11111111.11000000 / 26
255.255.255.128 11111111.11111111.11111111.10000000 / 25
255.255.255.0 11111111.11111111.11111111.00000000 / 24
从/ 27,我们知道(11111111.11111111.11111111.11100000)。 从左边算起,它是从最后一个八位字节,其等于255.255.255.224子网掩码的第三数目。 (不要指望0,0是/ 24),从而128,192 224..etc
在这些地方数学进来:
使用子网掩码 - 子网掩码先前列出的子网掩码的在这种情况下224-192 = 32
我们知道192.115.103.64是网络:64 + 32 = 96(对于/ 27的下一个网络)
这意味着我们有0.0 0.32。 64. 96. 128. 160. 192. 224.(不能使用256,因为它是.255)
下面是范围为64 - 96。
网络是64。
第一主机是65(第一网络1)
最后一台主机是94(-1广播)
广播是95(最后一个网络-1)
您可能已经知道这一点,但检查你得到这个东西右看看http://www.subnet-calculator.com/ -你可以看到有位如何表示地址的网络和主机部分。
我知道这是一个老问题,但我发现,似乎为我做的一种技巧上的NuGet这个漂亮的图书馆:
http://nuget.org/packages/TakeIo.NetworkAddress/
我会建议使用IPNetwork图书馆https://github.com/lduchosal/ipnetwork 。 作为第2版,它支持IPv4和IPv6,以及。
IPv4的
IPNetwork ipnetwork = IPNetwork.Parse("192.168.0.1/25");
Console.WriteLine("Network : {0}", ipnetwork.Network);
Console.WriteLine("Netmask : {0}", ipnetwork.Netmask);
Console.WriteLine("Broadcast : {0}", ipnetwork.Broadcast);
Console.WriteLine("FirstUsable : {0}", ipnetwork.FirstUsable);
Console.WriteLine("LastUsable : {0}", ipnetwork.LastUsable);
Console.WriteLine("Usable : {0}", ipnetwork.Usable);
Console.WriteLine("Cidr : {0}", ipnetwork.Cidr);
产量
Network : 192.168.0.0
Netmask : 255.255.255.128
Broadcast : 192.168.0.127
FirstUsable : 192.168.0.1
LastUsable : 192.168.0.126
Usable : 126
Cidr : 25
玩得开心 !
输入: 192.168.0.1/25
掩模是这一部分: /25
要查找网络地址做到以下几点:
减去从IP长度掩模(32 - 掩模)= 32 - 25 = 7,从右侧把这些位
在给定的IP地址,即: 192.168.0.1
以二进制为: 11111111 11111111 00000000 00000001
现在,用7位右“0” 1111111 11111111 00000000 00000000
哪个十进制就是: 192.168.0.0
(这是网络地址)
为了找到第一个有效的/可用的IP地址添加+1到网络地址即: 192.168.0.1
找到最后/广播地址的程序是一样的,找到网络地址,但在这里,你必须做出从右到“1”(32屏蔽)位
即: 11111111 11111111 00000000 01111111
哪个十进制是192.168.0.127
为了找到最后一个有效的/可用的IP地址从广播地址即减去1: 192.168.0.126