当IP范围被写成aaa.bbb.ccc.ddd/netmask (CIDR表示法)时,我需要使用C#计算出此范围内第一个和最后一个包含的IP地址。
示例:
输入:192.168.0.1/25
结果:192.168.0.1 - 192.168.0.126
我的好朋友Alessandro写了一篇关于C#中位运算符的好文章,你应该阅读它,这样你就会知道该怎么做。
很容易理解。如果将给定的IP地址转换为二进制,网络地址是其中所有主机位(子网掩码中的0)都为0的IP地址,而广播地址是其中所有主机位都为1的IP地址。
例如:
ip 192.168.33.72 mask 255.255.255.192
11111111.11111111.11111111.11000000 (subnet mask)
11000000.10101000.00100001.01001000 (ip address)
加粗的部分是主机位(其余是网络位)。如果将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
我会直接贴出代码:
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);
BitConverter.IsLittleEndian
来确定是否需要使用 Reverse()
。 - JamieSee 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
要找到最后/广播地址,程序与查找网络地址相同,但是这里必须将(32-掩码)位从右边变为'1'
即:11111111 11111111 00000000 01111111
,转换成十进制为:192.168.0.127
要找到最后一个有效/可用的IP地址,请从广播地址中减去1,即:192.168.0.126