Saltar al contenido

Convierta la notación CIDR en un rango de IP

Solución:

Aquí hay una forma de manejarlo, sin usar ninguna función de biblioteca, para aclarar lo que está sucediendo y para ayudar si alguien necesita implementarlo en otros idiomas más adelante.

El código primero convierte el CIDR en un número de 32 bits, luego crea la máscara para determinar la dirección inicial, usa la inversa de la máscara para determinar la dirección final y luego vuelve a convertir al formato CIDR.

Tenga en cuenta que no hay detección de errores, por lo que la entrada debe estar en formato abcd / m.

La conversión de la dirección IP es simplemente una simple concatenación de los cuatro octetos en forma de big endian (AABBCCDD) usando cambios de bits.

La máscara indica cuántos bits del bit más significativo son fijos, lo que significa que 32 es un rango de IP único y 0 sería el rango de IP completo. Por lo tanto, podemos tomar una máscara con todos los bits configurados y desplazarla hacia la izquierda con 32-maskbits para determinar la máscara real.

Si configuramos el maskbits bits a cero, obtenemos el comienzo del rango, por lo que Y la IP con los bits de máscara. Si establecemos los bits en uno, obtenemos el final del rango, por lo que lo haremos con los bits de máscara negados.

Imprimir la dirección IP en formato CIDR es nuevamente simple: simplemente divida el valor de 32 bits en octetos y escríbalos separados por puntos.

using System;

namespace CSTests
{
    class Program
    {
        static string toip(uint ip)
        {
            return String.Format("{0}.{1}.{2}.{3}", ip >> 24, (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff);
        }

        static void Main(string[] args)
        {
            string IP = "5.39.40.96/27";
            string[] parts = IP.Split('.', "https://foroayuda.es/");

            uint ipnum = (Convert.ToUInt32(parts[0]) << 24) |
                (Convert.ToUInt32(parts[1]) << 16) |
                (Convert.ToUInt32(parts[2]) << 8) |
                Convert.ToUInt32(parts[3]);

            int maskbits = Convert.ToInt32(parts[4]);
            uint mask = 0xffffffff;
            mask <<= (32 - maskbits);

            uint ipstart = ipnum & mask;
            uint ipend = ipnum | (mask ^ 0xffffffff);

            Console.WriteLine(toip(ipstart) + " - " + toip(ipend));
        }
    }
}

Producción:

5.39.40.96 – 5.39.40.127

¡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 *