Fonction PHP inet_ntop() : Tout ce que vous devez savoir
Découvrez comment la fonction inet_ntop() en PHP convertit une adresse IP binaire compactée en format lisible par l'homme pour IPv4 et IPv6.
La fonction inet_ntop() convertit une adresse IP binaire compactée en une chaîne lisible par l'homme. Le nom signifie "network to presentation" (réseau vers présentation) : elle prend la forme compacte et de longueur fixe qu'une adresse IP a en mémoire (ou dans une colonne de base de données) et la retransforme en notation décimale pointée (127.0.0.1) ou hexadécimale avec deux-points (::1) que vous pouvez lire et journaliser.
Cette page explique ce qu'est le format compacté, comment utiliser inet_ntop() pour IPv4 et IPv6, comment elle se combine avec inet_pton(), comment gérer les erreurs, et dans quels cas il est judicieux d'y recourir.
Pourquoi le format « compacté » existe-t-il
Une adresse IPv4 telle que 192.168.1.1 n'est en réalité que 32 bits — quatre octets. Une adresse IPv6 fait 128 bits — seize octets. Le texte lisible que vous voyez habituellement est une présentation de ces octets, pas les octets eux-mêmes.
Lorsque vous stockez ou comparez des adresses à grande échelle, les octets bruts sont plus petits et plus rapides : une colonne VARBINARY(16) contient n'importe quelle adresse IPv4 ou IPv6, se trie correctement et s'indexe bien. inet_pton() produit cette forme compactée ; inet_ntop() l'inverse pour que les humains puissent à nouveau la lire.
"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)Syntaxe
inet_ntop(string $ip): string|falseLa fonction prend un seul paramètre :
$ip— une chaîne binaire contenant l'adresse compactée. Elle doit être exactement 4 octets pour IPv4 ou 16 octets pour IPv6.
Elle retourne l'adresse sous forme de chaîne lisible, ou false si l'entrée n'est pas une adresse compactée valide de 4 ou 16 octets.
Convertir une adresse IPv4
Une adresse IPv4 compactée est constituée de quatre octets bruts, un par octet. L'adresse de bouclage 127.0.0.1 correspond donc à \x7f (127), \x00, \x00, \x01 :
Écrire manuellement des séquences d'échappement est source d'erreurs. En pratique, vous obtenez les octets compactés depuis inet_pton() ou depuis une base de données, puis vous les passez directement à inet_ntop() :
<?php
$packed = inet_pton("192.168.1.1"); // text -> 4 packed bytes
echo inet_ntop($packed); // Outputs: 192.168.1.1Convertir une adresse IPv6
La même fonction gère IPv6 — passez-lui une chaîne compactée de 16 octets et elle retourne la forme hexadécimale avec deux-points compressée, en réduisant automatiquement les séquences de zéros en :: :
<?php
$packed = inet_pton("2001:db8::1");
echo inet_ntop($packed); // Outputs: 2001:db8::1Puisqu'une seule fonction couvre les deux familles, vous pouvez effectuer un aller-retour pour n'importe quelle adresse sans avoir à tester son type — pratique lorsqu'une colonne peut contenir l'un ou l'autre type.
Gérer les entrées invalides
Si la chaîne binaire ne fait pas exactement 4 ou 16 octets, inet_ntop() retourne false et émet un avertissement. Vérifiez toujours le résultat avant de l'utiliser :
<?php
$result = inet_ntop("not a packed address");
if ($result === false) {
echo "Invalid packed address.";
} else {
echo $result;
}
// Outputs: Invalid packed address.Utilisez une comparaison stricte === false : une vérification souple rejetterait aussi "0.0.0.0", qui est pourtant une adresse valide.
inet_ntop() vs. ip2long()
Pour IPv4, vous pouvez également rencontrer long2ip(), qui retransforme un entier 32 bits en chaîne pointée. La différence :
ip2long()/long2ip()fonctionnent avec une représentation entière et sont réservés à IPv4.inet_pton()/inet_ntop()fonctionnent avec une chaîne binaire et prennent en charge IPv4 et IPv6.
Si votre application doit gérer IPv6, préférez la paire inet_* afin qu'un seul chemin de code serve toutes les adresses.
Quand l'utiliser
- Relire des adresses depuis le stockage — une colonne
VARBINARY(16)stocke n'importe quelle adresse de façon compacte ;inet_ntop()restitue les lignes pour l'affichage ou la journalisation. - Normaliser les entrées utilisateur — un aller-retour via
inet_pton()puisinet_ntop()produit une forme canonique (par exemple2001:0db8::0001devient2001:db8::1), de sorte que des adresses égales se comparent comme des chaînes égales. - Travailler avec des données de socket brutes — les adresses compactées retournées par des appels réseau bas niveau deviennent lisibles pour les journaux et les messages d'erreur.
Fonctions associées
inet_pton()— l'inverse : adresse lisible vers chaîne binaire compactée.ip2long()— chaîne IPv4 vers entier.long2ip()— entier vers chaîne IPv4.gethostbyname()— résoudre un nom d'hôte en son adresse IPv4.
Conclusion
inet_ntop() retransforme une adresse IP compactée de 4 ou 16 octets en texte lisible pour IPv4 et IPv6, en complément de inet_pton(). Stockez les adresses sous leur forme binaire compacte pour un indexage efficace, convertissez-les avec inet_ntop() quand vous devez les afficher ou les journaliser, et vérifiez toujours qu'un retour false n'indique pas une entrée malformée.