當IP範圍被寫爲aaa.bbb.ccc.ddd/netmask(CIDR Notation)我需要用C#計算這個範圍中的第一個和最後一個包含的IP地址。如何計算IP地址和網絡掩碼時的IP範圍?
實施例:
輸入: 192.168.0.1/25
結果: 192.168.0.1 - 192.168.0.126
當IP範圍被寫爲aaa.bbb.ccc.ddd/netmask(CIDR Notation)我需要用C#計算這個範圍中的第一個和最後一個包含的IP地址。如何計算IP地址和網絡掩碼時的IP範圍?
實施例:
輸入: 192.168.0.1/25
結果: 192.168.0.1 - 192.168.0.126
我的好朋友Alessandro有一個nice post關於C#中的位操作符,你應該閱讀它,以便你知道該怎麼做。
這很容易。如果將給定的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)
加粗的部分是主機位(其餘是網絡比特)。如果你把所有的主機位爲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
反轉掩模(與那些XOR),並且它與IP。加1.這將是起始範圍。 或帶有掩碼的IP。這將是結束範圍。
我只是張貼代碼:
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);
您可能已經知道這一點,但要檢查您是否收到了這些東西,請查看http://www.subnet-calculator.com/ - 您可以在那裏看到這些位代表網絡和主機地址部分。
我從網絡部署位置學習了這個快捷方式。它幫助了我很多,我想我會和大家分享這個祕密。到目前爲止,我還無法找到我所知道的更簡單的在線方式。
例如一個網絡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. 128. 96. 160. 192. 224.(不能使用256,因爲它是0.255)
這裏是範圍爲64 - 96
網絡是64.
第一主機65(第一網絡+1)
最後一臺主機是94(廣播-1)
廣播是95(最後一個網絡-1)
我知道這是一個老問題,但我發現了這個漂亮的天秤座上的NuGet RY似乎爲我做的一種技巧:
我會建議使用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
找到最後/廣播地址的程序是一樣的,找到網絡地址,但在這裏,你必須做出 (32面罩)從右到「位1'
即:11111111 11111111 00000000 01111111
哪個小數是192.168.0.127
要從廣播地址 即找到最後一個有效的/可用的IP地址減1:192.168.0.126
感謝克里斯·韋伯的CIDR注:) – Anheledir 2011-04-14 16:15:24