W3docs

Función PHP inet_ntop(): Todo lo que necesitas saber

Aprende a usar inet_ntop() en PHP para convertir direcciones IP binarias IPv4 e IPv6 a formato legible, con ejemplos y manejo de errores.

La función inet_ntop() convierte una dirección IP binaria compacta en una cadena legible por humanos. El nombre significa "network to presentation" (red a presentación): toma la forma compacta de longitud fija que tiene una dirección IP en memoria (o en una columna de base de datos) y la devuelve a la notación decimal con puntos (127.0.0.1) o hexadecimal con dos puntos (::1) que puedes leer y registrar.

Esta página explica qué es el formato compacto, cómo usar inet_ntop() tanto para IPv4 como para IPv6, cómo se combina con inet_pton(), cómo manejar errores y cuándo es la opción correcta.

Por qué existe un formato "compacto"

Una dirección IPv4 como 192.168.1.1 son simplemente 32 bits — cuatro bytes. Una dirección IPv6 tiene 128 bits — dieciséis bytes. El texto legible que normalmente ves es una presentación de esos bytes, no los bytes en sí mismos.

Cuando almacenas o comparas direcciones a escala, los bytes sin procesar son más pequeños y rápidos: una columna VARBINARY(16) puede almacenar cualquier dirección IPv4 o IPv6, se ordena correctamente y tiene buen rendimiento en índices. inet_pton() produce esa forma compacta; inet_ntop() la invierte para que los humanos puedan leerla de nuevo.

"127.0.0.1"  --inet_pton()-->  \x7f\x00\x00\x01   (4 packed bytes)
\x7f\x00\x00\x01  --inet_ntop()-->  "127.0.0.1"   (readable text)

Sintaxis

inet_ntop(string $ip): string|false

La función acepta un único parámetro:

  • $ip — una cadena binaria que contiene la dirección compacta. Debe tener exactamente 4 bytes para IPv4 o 16 bytes para IPv6.

Devuelve la dirección como una cadena legible, o false si la entrada no es una dirección compacta válida de 4 o 16 bytes.

Convertir una dirección IPv4

Una dirección IPv4 compacta son cuatro bytes sin procesar, uno por octeto. La dirección de loopback 127.0.0.1 es por tanto \x7f (127), \x00, \x00, \x01:

php— editable, runs on the server

Escribir secuencias de escape a mano es propenso a errores. En la práctica obtienes los bytes compactos de inet_pton() o de una base de datos, y los pasas directamente a inet_ntop():

<?php

$packed = inet_pton("192.168.1.1"); // text -> 4 packed bytes
echo inet_ntop($packed);            // Outputs: 192.168.1.1

Convertir una dirección IPv6

La misma función maneja IPv6 — pásale una cadena compacta de 16 bytes y devuelve la forma hexadecimal con dos puntos comprimida, colapsando secuencias de ceros a :: automáticamente:

<?php

$packed = inet_pton("2001:db8::1");
echo inet_ntop($packed); // Outputs: 2001:db8::1

Como una sola función cubre ambas familias, puedes hacer conversiones de ida y vuelta con cualquier dirección sin necesidad de bifurcar por tipo — muy útil cuando una columna puede contener cualquiera de los dos tipos.

Manejo de entradas no válidas

Si la cadena binaria no tiene exactamente 4 o 16 bytes, inet_ntop() devuelve false y emite una advertencia. Comprueba siempre el resultado antes de usarlo:

<?php

$result = inet_ntop("not a packed address");

if ($result === false) {
    echo "Invalid packed address.";
} else {
    echo $result;
}
// Outputs: Invalid packed address.

Usa una comparación estricta === false: una comprobación flexible también rechazaría "0.0.0.0", que es una dirección válida.

inet_ntop() vs. ip2long()

Para IPv4 también puedes ver long2ip(), que convierte un entero de 32 bits de vuelta a una cadena con puntos. La diferencia:

  • ip2long() / long2ip() trabajan con una representación entera y son solo para IPv4.
  • inet_pton() / inet_ntop() trabajan con una cadena binaria y admiten tanto IPv4 como IPv6.

Si tu aplicación necesita manejar IPv6 en algún momento, prefiere el par inet_* para que una sola ruta de código sirva para todas las direcciones.

Cuándo usarlo

  • Leer direcciones almacenadas — una columna VARBINARY(16) almacena cualquier dirección de forma compacta; inet_ntop() convierte las filas para mostrarlas o registrarlas.
  • Normalizar la entrada del usuario — pasar por inet_pton() y luego inet_ntop() produce una forma canónica (por ejemplo, 2001:0db8::0001 se convierte en 2001:db8::1), de modo que direcciones iguales se comparan como cadenas iguales.
  • Trabajar con datos de socket sin procesar — las direcciones compactas devueltas por llamadas de red de bajo nivel se vuelven legibles para registros y mensajes de error.

Funciones relacionadas

  • inet_pton() — la inversa: dirección legible a cadena binaria compacta.
  • ip2long() — cadena IPv4 a entero.
  • long2ip() — entero de vuelta a cadena IPv4.
  • gethostbyname() — resuelve un nombre de host a su dirección IPv4.

Conclusión

inet_ntop() convierte una dirección IP compacta de 4 o 16 bytes de vuelta a texto legible tanto para IPv4 como para IPv6, complementando a inet_pton(). Almacena las direcciones en su forma binaria compacta para una indexación eficiente, conviértelas con inet_ntop() cuando necesites mostrarlas o registrarlas, y comprueba siempre si hay un retorno false ante entradas malformadas.

Práctica

Práctica
¿Qué hace la función inet_ntop() en PHP?
¿Qué hace la función inet_ntop() en PHP?
Was this page helpful?