当IP范围写为aaa.bbb.ccc.ddd / netmask(CIDR Notation)时,我需要使用C#计算此范围内的第一个和最后一个包含的IP地址。
示例:
输入: 192.168.0.1/25
结果: 192.168.0.1 - 192.168.0.126
答案 0 :(得分:60)
我的好朋友Alessandro在C#中有关于位操作符的nice post,您应该阅读它以便知道该怎么做。
非常简单。如果将分配给您的IP分解为二进制,则网络地址是所有主机位(子网掩码中的0)为0的IP地址,最后一个地址(广播地址)是所有主机的位置位是1。
例如:
ip 192.168.33.72 mask 255.255.255.192
11111111.11111111.11111111.11000000 (subnet mask)
11000000.10101000.00100001.01001000 (ip address)
粗体部分是HOST位(其余是网络位)。如果在IP上将所有主机位都设置为0,则会获得第一个可能的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
答案 1 :(得分:26)
我只是发布代码:
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);
答案 2 :(得分:8)
反转掩码(XOR与1),与IP一起使用。添加1.这将是起始范围。 或带掩码的IP。这将是结束范围。
答案 3 :(得分:8)
我从网络部署位置开始学习这个快捷方式。它对我帮助很大,我想我会和大家分享这个秘密。到目前为止,我无法找到一种比较熟悉的在线方式。
例如网络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 .32。 64. 96. 128. 160. 192. 224.(不能使用256,因为它是.255)
这是范围64 - 96。
网络是64。
第一个主机是65.(第一个网络+1)
最后一位主持人是94.(广播-1)
广播是95.(最后一个网络-1)
答案 4 :(得分:2)
你可能已经知道这一点了,但是为了检查你是否正确看到http://www.subnet-calculator.com/ - 你可以看到这些位如何代表地址的网络和主机部分。
答案 5 :(得分:2)
我知道这是一个较老的问题,但是我在nuget上找到了这个漂亮的库,它似乎对我来说只是一招:
答案 6 :(得分:2)
我建议使用IPNetwork Library 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
玩得开心!
答案 7 :(得分:2)
输入:192.168.0.1/25
掩码是这部分:/25
要查找网络地址,请执行以下操作:
从ip长度(32 - mask)= 32 - 25 = 7中减去掩码并从右边取这些位
在给定的IP地址中
即:二进制中的192.168.0.1
是:
11111111 11111111 00000000 00000001
现在,取右边的7位&#39; 0&#39;
1111111 11111111 00000000 00000000
以十进制表示的是:
192.168.0.0
(这是网络地址)
要查找第一个有效/可用的IP地址,请将+1添加到网络地址I.e:192.168.0.1
要查找最后/广播地址,该过程与查找网络地址的过程相同,但您必须在此处进行操作 (32-mask)位从右到&#39; 1&#39;
I.e:11111111 11111111 00000000 01111111
以十进制表示192.168.0.127
查找最后一个有效/可用的ip地址从广播地址中减去1
我:192.168.0.126