将 IP 地址转换为 CIDR

Converting an IP Address into CIDR

我想设计一个代码,我可以在其中搜索输入的 IP 地址,并使用它给出 IP 地址的 CIDR 的输出。我需要输出是一个变量,因为我需要 CIDR 用于代码中的另一个步骤。

 static void Main(string[] args)
 {
            IPAddress addr = IPAddress.Parse("8.8.8.8");
            IPHostEntry entry = Dns.GetHostEntry(addr);
            Console.WriteLine("IP Address: " + addr);
            Console.WriteLine("Host Name: " + entry.HostName);

根据 CIDR,我假设您想获得给定 IP 地址的 classful 网络掩码长度。 使用 this wiki 作为参考,您可以将地址转换为位数组,然后检查第一个前导位。

这个有用的扩展 class 将您的 IP 地址转换为位(实际上是布尔值):

/// <summary>
/// Converts an array of bytes to a BitArray instance, 
/// respecting the endian form of the operating system
/// </summary>
public static class BitArrayExtensions
{
    public static BitArray ToBitArray(this byte[] bytes)
    {
        bool[] allbits = new bool[bytes.Length * 8];
        for (int b = 0; b < bytes.Length; b++)
        {
            bool[] bits = new bool[8];
            new BitArray(new byte[] { bytes[b] }).CopyTo(bits, 0);
            if (BitConverter.IsLittleEndian)
                Array.Reverse(bits);

            bits.CopyTo(allbits, b * 8);
        }
        return new BitArray(allbits);
    }
}

有了这个 class 就可以很容易地编写一个方法来找到 IP 地址的 classful 掩码长度:/8、/16 或 /24

    /// <summary>
    /// Gets the length of the classful subnet mask of a given IPv4 address
    /// </summary>
    public int GetClassfulMaskbits(IPAddress address)
    {
        BitArray addressInBits = address.GetAddressBytes().ToBitArray();
        if (!addressInBits[0])  //leading bit = 0 => class A
            return 8; //default mask of class A = 255.0.0.0
        if(!addressInBits[1]) //leading bits = 10 => class B
            return 16; //default mask of class B = 255.255.0.0
        if (!addressInBits[2]) //leading bits = 110 => class C
            return 24; //default mask of class C = 255.255.255.0

        return 0; //class D or E has no classful subnet mask
    }

BitArray 扩展 class 也可用于其他 IP 计算。