2010-03-24 97 views
4

好吧,我似乎無法想出解決辦法:給出以下幾點:給定一個IP地址和子網掩碼,如何計算CIDR?

IP address = 192.168.1.0
Subnetmask = 255.255.255.240

使用C#,我該如何計算CIDR標記192.168.1.0/28?有沒有簡單的方法來實現這一目標?我錯過了什麼嗎?

謝謝!

回答

2

我沒有它作爲C#代碼,但這裏是在VB中的答案。不應該難以轉換。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 

    Dim someIP As Net.IPAddress = Net.IPAddress.Parse("192.168.1.10") 
    Dim someMASK As Net.IPAddress = Net.IPAddress.Parse("255.255.255.240") 

    Dim ipL As Long = IPtoLong(someIP) 
    Dim maskL As Long = IPtoLong(someMASK) 

    'Convert Mask to CIDR(1-30) 
    Dim oneBit As Long = &H80000000L 
    Dim CIDR As Integer = 0 

    For x As Integer = 31 To 0 Step -1 
     If (maskL And oneBit) = oneBit Then CIDR += 1 Else Exit For 
     oneBit = oneBit >> 1 
    Next 

    Dim answer As String = LongToIp(ipL And maskL) & " /" & CIDR.ToString 

End Sub 

Public Function IPtoLong(ByVal theIP As Net.IPAddress) As Long 'convert IP to number 

    Dim IPb() As Byte = theIP.GetAddressBytes 'get the octets 
    Dim addr As Long 'accumulator for address 

    For x As Integer = 0 To 3 
     addr = addr Or (CLng(IPb(x)) << (3 - x) * 8) 
    Next 
    Return addr 

End Function 

Public Function LongToIp(ByVal theIP As Long) As String 'convert number back to IP 

    Dim IPb(3) As Byte '4 octets 
    Dim addr As String = "" 'accumulator for address 

    Dim mask8 As Long = MaskFromCidr(8) 'create eight bit mask 

    For x = 0 To 3 'get the octets 
     IPb(x) = CByte((theIP And mask8) >> ((3 - x) * 8)) 
     mask8 = mask8 >> 8 
     addr &= IPb(x).ToString & "." 'add current octet to string 
    Next 
    Return addr.TrimEnd("."c) 

End Function 

Private Function MaskFromCidr(ByVal CIDR As Integer) As Long 
    MaskFromCidr = CLng(2^((32 - CIDR)) - 1) Xor 4294967295L 
End Function 
6

256 - 240 = 16 = 2**4, 32 - 4 = 28

這是不是一個真正的C#問題。

要從IP和掩碼獲得網絡地址,您可以將字節and應用於IP和掩碼。您可以使用IPAddress.Parse()IPAddress.GetAddressBytes()從字符串中獲取字節。

+0

感謝您的信息。我知道我可以使用IPAddress類操縱字符串到IP地址和字節。我也理解子網/廣播/ cidr計算等背後的邏輯...我只是無法把它放到一個簡單的C#方法,當我輸入'255.255.255.192'時,給我'26'# – RoelF 2010-03-24 13:42:59

+0

C#具有位操作運算符。 – wRAR 2010-03-24 14:00:26

+0

我知道。這不是問題。沒關係,我明白了。 – RoelF 2010-03-24 14:13:34

3

我必須做同樣的事情,沒有任何新的信息,但這個片段可以派上用場尋找一種方式,在C#這樣做旁邊的人。 請注意,這種方法只計算連續1的數量,並且讓您將其附加到IP的工作。

public class IPAddressHelper 
{ 
    public static UInt32 SubnetToCIDR(string subnetStr) 
    { 
     IPAddress subnetAddress = IPAddress.Parse(subnetStr); 
     byte[] ipParts = subnetAddress.GetAddressBytes(); 
     UInt32 subnet = 16777216 * Convert.ToUInt32(ipParts[0]) + 65536 * Convert.ToUInt32(ipParts[1]) + 256 * Convert.ToUInt32(ipParts[2]) + Convert.ToUInt32(ipParts[3]); 
     UInt32 mask = 0x80000000; 
     UInt32 subnetConsecutiveOnes = 0; 
     for (int i = 0; i < 32; i++) 
     { 
      if (!(mask & subnet).Equals(mask)) break; 

      subnetConsecutiveOnes++; 
      mask = mask >> 1; 
     } 
     return subnetConsecutiveOnes; 
    } 
} 
0

Get CIDR from netmask

用法:

var cidrnetmask = MaskToCIDR(IPAddress.Parse("255.0.0.0").GetAddressBytes()); 

這適用於IPv4的。要支持IPv6,一個可以擴展的字節數,但希望沒有人會嘗試使用IPv6的舊式網絡掩碼:O)

方法:

static int MaskToCIDR(byte[] bytes) 
{ 

     var b0 = bytes[0]; 
     var b1 = bytes[1]; 
     var b2 = bytes[2]; 
     var b3 = bytes[3]; 

     return 
      b3 != 0 ? (
       (b3 & 0x01) != 0 ? 32 : 
       (b3 & 0x02) != 0 ? 31 : 
       (b3 & 0x04) != 0 ? 30 : 
       (b3 & 0x08) != 0 ? 29 : 
       (b3 & 0x10) != 0 ? 28 : 
       (b3 & 0x20) != 0 ? 27 : 
       (b3 & 0x40) != 0 ? 26 : 
            25) : 
      b2 != 0 ? (
       (b2 & 0x01) != 0 ? 24 : 
       (b2 & 0x02) != 0 ? 23 : 
       (b2 & 0x04) != 0 ? 22 : 
       (b2 & 0x08) != 0 ? 21 : 
       (b2 & 0x10) != 0 ? 20 : 
       (b2 & 0x20) != 0 ? 19 : 
       (b2 & 0x40) != 0 ? 18 : 
            17) : 
      b1 != 0 ? (
       (b1 & 0x01) != 0 ? 16 : 
       (b1 & 0x02) != 0 ? 15 : 
       (b1 & 0x04) != 0 ? 14 : 
       (b1 & 0x08) != 0 ? 13 : 
       (b1 & 0x10) != 0 ? 12 : 
       (b1 & 0x20) != 0 ? 11 : 
       (b1 & 0x40) != 0 ? 10 : 
            9 ) : 
      b0 != 0 ? (
       (b0 & 0x01) != 0 ? 8 : 
       (b0 & 0x02) != 0 ? 7 : 
       (b0 & 0x04) != 0 ? 6 : 
       (b0 & 0x08) != 0 ? 5 : 
       (b0 & 0x10) != 0 ? 4 : 
       (b0 & 0x20) != 0 ? 3 : 
       (b0 & 0x40) != 0 ? 2 : 
            1) : 
           0; 
} 
0

我的解決方法,首先解析到ip地址:

var Subnetmask = "255.255.255.240"; 
IPAddress ip = IPAddress.Parse(Subnetmask); 

然後,檢查組位計數在掩模IP:

var intAddress = (int)IPAddress.Address; 
Console.WriteLine(NumberOfSetBits(intAddress)); //28 

函數(從https://stackoverflow.com/a/12175897/1271037):

int NumberOfSetBits(int i) 
{ 
    i = i - ((i >> 1) & 0x55555555); 
    i = (i & 0x33333333) + ((i >> 2) & 0x33333333); 
    return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24; 
} 
相關問題