W3docs

PHP inet_pton() Funktion: Alles, was Sie wissen müssen

Die PHP-Funktion inet_pton() wandelt eine IP-Adresse aus einem menschenlesbaren Format in einen gepackten binären String um. Alles Wichtige hier.

Die PHP-Funktion inet_pton() wandelt eine menschenlesbare IP-Adresse — wie 127.0.0.1 oder 2001:db8::1 — in ihre gepackte binäre Darstellung um. Der Name steht für „presentation to network": Sie nimmt die Darstellungsform (den Text mit Punkten/Doppelpunkten, den Sie eingeben) und gibt die Netzwerkform zurück (die rohen Bytes, die tatsächlich über das Netz übertragen werden).

Diese Seite behandelt die Syntax, IPv4 und IPv6, wie das Ergebnis sicher gelesen wird, wie es umgekehrt werden kann, und warum es sinnvoll ist, IPs überhaupt binär zu speichern.

Was ist die inet_pton() Funktion?

inet_pton() analysiert einen gültigen IPv4- oder IPv6-String und gibt einen gepackten in-addr binären String zurück — 4 Bytes für IPv4, 16 Bytes für IPv6. Wenn die Eingabe keine gültige IP-Adresse ist, gibt sie false zurück, anstatt einen Fehler zu werfen.

Der zurückgegebene „binäre String" ist nicht menschenlesbar: Es handelt sich um rohe Bytes, sodass die direkte Ausgabe auf einem Terminal oder im Browser unleserliche Zeichen anzeigt. Um ihn zu inspizieren, konvertieren Sie ihn mit bin2hex(). Um ihn wieder in einen normalen IP-String umzuwandeln, verwenden Sie die Gegenfunktion inet_ntop().

Syntax

inet_pton(string $ip): string|false

Die Funktion nimmt einen Parameter entgegen:

  • $ip — die zu konvertierende IP-Adresse als String (IPv4 oder IPv6).

Rückgabewert: der gepackte binäre String bei Erfolg oder false, wenn $ip keine gültige IP-Adresse ist.

Grundlegendes Beispiel: IPv4

php— editable, runs on the server

Die 4 rohen Bytes von 127.0.0.1 sind 7f 00 00 01 — genau die dezimalen Oktette 127.0.0.1 in hexadezimaler Schreibweise. Da der binäre String selbst nicht druckbar ist, führen wir ihn durch bin2hex(), damit die Bytes als lesbare Hex-Werte erscheinen.

IPv4 und IPv6

Anders als das ältere ip2long(), das nur IPv4 unterstützt, funktioniert inet_pton() für beide Adressfamilien. IPv4 erzeugt 4 Bytes; IPv6 erzeugt 16:

<?php

echo bin2hex(inet_pton("192.168.1.1")), "\n";   // c0a80101  (4 bytes)
echo bin2hex(inet_pton("2001:db8::1")), "\n";    // 20010db8000000000000000000000001 (16 bytes)

echo strlen(inet_pton("192.168.1.1")), "\n";     // 4
echo strlen(inet_pton("2001:db8::1")), "\n";     // 16

Die Überprüfung von strlen() am Ergebnis ist die einfachste Methode, um festzustellen, welcher Adressfamilie eine Adresse angehört: Eine Länge von 4 bedeutet IPv4, 16 bedeutet IPv6.

Umgang mit ungültiger Eingabe

Wenn der String keine gültige IP-Adresse ist, gibt inet_pton() false zurück. Überprüfen Sie das Ergebnis immer, bevor Sie es verwenden — andernfalls könnten Sie versehentlich false (einen leeren String) speichern oder vergleichen:

<?php

$input = "not-an-ip";
$packed = inet_pton($input);

if ($packed === false) {
    echo "Invalid IP address";
} else {
    echo bin2hex($packed);
}
// Outputs: Invalid IP address

Verwenden Sie hier den strikten Vergleich (===). Eine gültige 0.0.0.0 wird zum Byte 00000000 gepackt, dessen erstes Byte ein Null-Byte ist; ein lockerer == false-Check könnte bei Grenzfällen fehlschlagen, daher ist === false der sichere Test.

Die Konvertierung umkehren

inet_pton() und inet_ntop() sind ein aufeinander abgestimmtes Paar: Eine Funktion packt, die andere entpackt. Ein Hin-und-Rück-Durchlauf gibt die ursprüngliche Adresse zurück:

<?php

$packed = inet_pton("2001:db8::1");
echo inet_ntop($packed); // Outputs 2001:db8::1

Wann würde ich das verwenden?

Das Speichern von IPs als gepacktes Binärformat dient hauptsächlich der kompakten, sortierbaren und familienunabhängigen Speicherung:

  • Datenbankspeicherung. Eine binäre Spalte (VARBINARY(16)) speichert jede IPv4- oder IPv6-Adresse in einer festen, kompakten Form und sortiert korrekt. Verwenden Sie inet_pton() vor INSERT und inet_ntop() nach SELECT.
  • Bereichsvergleiche. Da die Bytes die numerische Reihenfolge bewahren, können Sie gepackte Strings vergleichen, um zu prüfen, ob eine Adresse in einem Subnetz liegt.
  • Exakte Treffer-Suchen. Das Vergleichen von Binärschlüsseln fester Länge ist schneller und vermeidet die Mehrdeutigkeit von Textformen (z. B. sind 2001:db8::1 und 2001:0db8:0000:...:0001 dieselbe Adresse, aber unterschiedliche Strings — durch das Packen werden sie normalisiert).

Für rein IPv4-bezogene numerische Berechnungen sind ip2long() und long2ip() eine Alternative, aber sie können IPv6 nicht darstellen.

Fazit

inet_pton() wandelt eine IPv4- oder IPv6-Adresse aus ihrer menschenlesbaren Textform in einen gepackten binären String um — 4 Bytes für IPv4, 16 für IPv6 — und gibt false bei ungültiger Eingabe zurück. Kombinieren Sie sie mit inet_ntop(), um die Konvertierung umzukehren, und verwenden Sie bin2hex(), wenn Sie die rohen Bytes inspizieren möchten. Sie ist der Standardweg, um IP-Adressen kompakt in einer Datenbank zu speichern und zu vergleichen, während beide Adressfamilien unterstützt werden.

Practice

Übung
Was macht die inet_pton() Funktion in PHP?
Was macht die inet_pton() Funktion in PHP?
Was this page helpful?