W3docs

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|false

La 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:

php— editable, runs on the server

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.1

Conversione 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::1

Poiché 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 poi inet_ntop() produce una forma canonica (ad esempio 2001:0db8::0001 diventa 2001: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.

Pratica

Pratica
Cosa fa la funzione inet_ntop() in PHP?
Cosa fa la funzione inet_ntop() in PHP?
Was this page helpful?