2009-09-24 138 views

回答

56

我的好朋友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 
+0

打我也是+1 :) – Andrew 2009-09-24 10:36:38

+0

這是如何計算我讀到目前爲止這些範圍的最好解釋。謝謝:-) – Anheledir 2009-09-24 10:44:29

+0

你怎麼知道它/ 24/25或/ 26?它是什麼? – 2012-10-25 20:25:55

5

反轉掩模(與那些XOR),並且它與IP。加1.這將是起始範圍。 或帶有掩碼的IP。這將是結束範圍。

23

我只是張貼代碼:

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); 
+0

並非所有的系統都是小端。你應該測試'BitConverter.IsLittleEndian'來確定你是否應該使用'Reverse()'。 – JamieSee 2012-03-14 16:43:39

+3

我建議使用mask = IPAddress.NetworkToHostOrder(mask)來代替。 – sunside 2013-02-28 19:15:37

1

您可能已經知道這一點,但要檢查您是否收到了這些東西,請查看http://www.subnet-calculator.com/ - 您可以在那裏看到這些位代表網絡和主機地址部分。

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.0 0.32。 64. 128. 96. 160. 192. 224.(不能使用256,因爲它是0.255)

這裏是範圍爲64 - 96

網絡是64.

第一主機65(第一網絡+1)

最後一臺主機是94(廣播-1)

廣播是95(最後一個網絡-1)

3

我會建議使用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 

玩得開心!

1

輸入: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