Saltar al contenido

Dada una dirección IP y una máscara de subred, ¿cómo calculo el CIDR?

Investigamos en todo internet para así traerte la solución para tu duda, si tienes alguna inquietud puedes dejar tu inquietud y contestaremos porque estamos para servirte.

Solución:

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

No es realmente una pregunta de C#.

Para obtener una dirección de red de una IP y una máscara, puede aplicar por bytes and a la IP y máscara. Puede obtener bytes de un string usando IPAddress.Parse() y IPAddress.GetAddressBytes().

Tuve que hacer lo mismo, no hay información nueva, pero este fragmento puede ser útil para la próxima persona que busque una manera de hacer esto en C#. tenga en cuenta que este método solo cuenta la cantidad de 1 consecutivos y le deja el trabajo de agregarlo a la 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;
    

¡Mantenlo simple!

Esto funciona solo para IPv4pero dado que IPv6 solo admite CIDR como /64 en fe80::1ff:fe23:4567:890a/64 Cálculos como ese son innecesarios allí.

Todo lo que necesita para una máscara de red IPv4:

int cidr = Convert.ToString(mask.Address, 2).Count( o => o == '1'); 

Explicación basada en el ejemplo dado:

IPAddress mask = new IPAddress(new byte[]  255, 255, 255, 240 );

// maskBinAsString = 11110000111101001111111111111111
string maskBinAsString = Convert.ToString(mask.Address, 2); 

// cidr = 28
int cidr = Convert.ToString(mask.Address, 2).Count( o=> o == '1'); 

Si te gustó nuestro trabajo, puedes dejar una crónica acerca de qué te ha impresionado de este post.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *