Saltar al contenido

Cómo convertir IPv6 de binario para almacenamiento en MySQL

La guía o código que encontrarás en este post es la resolución más rápida y válida que encontramos a esta inquietud o problema.

Solución:

fuimos por un VARBINARY(16) columna en su lugar y uso inet_pton() y inet_ntop() para hacer las conversiones:

https://github.com/skion/mysql-udf-ipv6

Las funciones se pueden cargar en un servidor MySQL en ejecución y le darán INET6_NTOP y INET6_PTON en SQL, al igual que el familiar INET_NTOA y INET_ATON funciones para IPv4.

Editar: ahora hay funciones compatibles en MySQL, solo que con nombres diferentes. Solo use lo anterior si está en MySQL anterior a 5.6 y está buscando una ruta de actualización futura conveniente.

Estas son las funciones que ahora uso para convertir direcciones IP desde y hacia el formato DECIMAL (39,0). Se denominan inet_ptod e inet_dtop para “presentación a decimal” y “decimal a presentación”. Necesita soporte de IPv6 y bcmath en PHP.

/**
 * Convert an IP address from presentation to decimal(39,0) format suitable for storage in MySQL
 *
 * @param string $ip_address An IP address in IPv4, IPv6 or decimal notation
 * @return string The IP address in decimal notation
 */
function inet_ptod($ip_address)

    // IPv4 address
    if (strpos($ip_address, ':') === false && strpos($ip_address, '.') !== false) 
        $ip_address = '::' . $ip_address;
    

    // IPv6 address
    if (strpos($ip_address, ':') !== false) 
        $network = inet_pton($ip_address);
        $parts = unpack('N*', $network);

        foreach ($parts as &$part) 
            if ($part < 0) 
                $part = bcadd((string) $part, '4294967296');
            

            if (!is_string($part)) 
                $part = (string) $part;
            
        

        $decimal = $parts[4];
        $decimal = bcadd($decimal, bcmul($parts[3], '4294967296'));
        $decimal = bcadd($decimal, bcmul($parts[2], '18446744073709551616'));
        $decimal = bcadd($decimal, bcmul($parts[1], '79228162514264337593543950336'));

        return $decimal;
    

    // Decimal address
    return $ip_address;


/**
 * Convert an IP address from decimal format to presentation format
 *
 * @param string $decimal An IP address in IPv4, IPv6 or decimal notation
 * @return string The IP address in presentation format
 */
function inet_dtop($decimal)

Reseñas y puntuaciones

Tienes la opción de asistir nuestro ensayo escribiendo un comentario o puntuándolo te damos las gracias.

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