W3docs

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

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

php— editable, runs on the server

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

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

Puisqu'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() puis inet_ntop() produit une forme canonique (par exemple 2001:0db8::0001 devient 2001: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.

Practice

Pratique
Que fait la fonction inet_ntop() en PHP ?
Que fait la fonction inet_ntop() en PHP ?
Was this page helpful?