给定IP地址和子网掩码,如何计算CIDR?

Roe*_*elF 5 .net c# ip-address subnet

好吧,我似乎无法弄明白:给出以下内容:

IP address = 192.168.1.0
Subnetmask = 255.255.255.240

使用c#,如何计算CIDR表示法192.168.1.0/28?有没有一种简单的方法来实现这一目标?我错过了什么吗?

谢谢!

wRA*_*RAR 6

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

这不是一个真正的C#问题.

要从IP和掩码获取网络地址,您可以按字节顺序and应用于IP和掩码.您可以使用IPAddress.Parse()和从字符串中获取字节IPAddress.GetAddressBytes().


Yon*_*rni 6

我不得不做同样的事情,没有新信息,但这个片段可能会派上用场,供下一个人寻找在 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;
    }
}
Run Code Online (Sandbox Code Playgroud)


dba*_*ett 1

我没有 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
Run Code Online (Sandbox Code Playgroud)