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|falseLa 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:
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.1Convertir 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::1Como 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 luegoinet_ntop()produce una forma canónica (por ejemplo,2001:0db8::0001se convierte en2001: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.