Funzione PHP inet_ntop(): Tutto quello che devi sapere
La funzione inet_ntop() in PHP converte una stringa binaria contenente un indirizzo IPv4 o IPv6 in un formato leggibile dall'uomo.
La funzione inet_ntop() converte un indirizzo IP binario compresso in una stringa leggibile dall'uomo. Il nome sta per "network to presentation" (rete in presentazione): prende la forma compatta e a lunghezza fissa che un indirizzo IP ha in memoria (o in una colonna di database) e la ritrasforma nella notazione decimale con punti (127.0.0.1) o esadecimale con due punti (::1) che puoi leggere e registrare nei log.
Questa pagina spiega cos'è il formato compresso, come usare inet_ntop() sia per IPv4 che per IPv6, come si abbina a inet_pton(), come gestire gli errori e quando è la scelta giusta.
Perché esiste un formato "compresso"
Un indirizzo IPv4 come 192.168.1.1 è in realtà solo 32 bit — quattro byte. Un indirizzo IPv6 è 128 bit — sedici byte. Il testo leggibile che vedi normalmente è una presentazione di quei byte, non i byte stessi.
Quando memorizzi o confronti indirizzi su larga scala, i byte grezzi sono più piccoli e più veloci: una colonna VARBINARY(16) contiene qualsiasi indirizzo IPv4 o IPv6, ordina correttamente e si indicizza bene. inet_pton() produce quella forma compressa; inet_ntop() la inverte in modo che gli esseri umani possano leggerla di nuovo.
"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)Sintassi
inet_ntop(string $ip): string|falseLa funzione accetta un singolo parametro:
$ip— una stringa binaria contenente l'indirizzo compresso. Deve essere esattamente 4 byte per IPv4 o 16 byte per IPv6.
Restituisce l'indirizzo come stringa leggibile, oppure false se l'input non è un indirizzo compresso valido di 4 o 16 byte.
Conversione di un indirizzo IPv4
Un indirizzo IPv4 compresso è composto da quattro byte grezzi, uno per ottetto. L'indirizzo di loopback 127.0.0.1 è quindi \x7f (127), \x00, \x00, \x01:
Scrivere manualmente le sequenze di escape è soggetto a errori. In pratica si ottengono i byte compressi da inet_pton() o da un database, per poi passarli direttamente a inet_ntop():
<?php
$packed = inet_pton("192.168.1.1"); // text -> 4 packed bytes
echo inet_ntop($packed); // Outputs: 192.168.1.1Conversione di un indirizzo IPv6
La stessa funzione gestisce IPv6 — passa una stringa compressa di 16 byte e restituisce la forma esadecimale con due punti compressa, collassando automaticamente le sequenze di zeri in :::
<?php
$packed = inet_pton("2001:db8::1");
echo inet_ntop($packed); // Outputs: 2001:db8::1Poiché una sola funzione gestisce entrambe le famiglie, puoi fare il round-trip di qualsiasi indirizzo senza ramificare in base al suo tipo — utile quando una colonna può contenere entrambi i tipi.
Gestione dell'input non valido
Se la stringa binaria non è esattamente 4 o 16 byte, inet_ntop() restituisce false ed emette un avviso. Controlla sempre il risultato prima di usarlo:
<?php
$result = inet_ntop("not a packed address");
if ($result === false) {
echo "Invalid packed address.";
} else {
echo $result;
}
// Outputs: Invalid packed address.Usa un confronto rigoroso === false: un controllo loose rifiuterebbe anche "0.0.0.0", che è un indirizzo valido.
inet_ntop() vs. ip2long()
Per IPv4 puoi vedere anche long2ip(), che trasforma un intero a 32 bit in una stringa con punti. La differenza:
ip2long()/long2ip()lavorano con una rappresentazione intera e sono solo per IPv4.inet_pton()/inet_ntop()lavorano con una stringa binaria e supportano sia IPv4 che IPv6.
Se la tua applicazione deve gestire anche IPv6, preferisci la coppia inet_* in modo che un unico percorso di codice serva ogni indirizzo.
Quando usarla
- Lettura degli indirizzi dalla memoria — una colonna
VARBINARY(16)memorizza qualsiasi indirizzo in modo compatto;inet_ntop()rende le righe visualizzabili per la visualizzazione o il logging. - Normalizzazione dell'input dell'utente — il round-trip attraverso
inet_pton()e poiinet_ntop()produce una forma canonica (ad esempio2001:0db8::0001diventa2001:db8::1), in modo che gli indirizzi uguali si confrontino come stringhe uguali. - Utilizzo con dati socket grezzi — gli indirizzi compressi restituiti da chiamate di rete di basso livello diventano leggibili per i log e i messaggi di errore.
Funzioni correlate
inet_pton()— l'inverso: indirizzo leggibile in stringa binaria compressa.ip2long()— stringa IPv4 in intero.long2ip()— intero di nuovo in stringa IPv4.gethostbyname()— risolve un hostname nel suo indirizzo IPv4.
Conclusione
inet_ntop() trasforma un indirizzo IP compresso di 4 o 16 byte in testo leggibile sia per IPv4 che per IPv6, completando inet_pton(). Memorizza gli indirizzi nella loro forma binaria compatta per un'indicizzazione efficiente, convertili con inet_ntop() quando devi mostrarli o registrarli, e controlla sempre un ritorno false in caso di input non valido.