In PHP wird die Funktion ip2long () häufig verwendet, um eine IP -Adresse (z. B. 192.168.1.1 ) in eine lange ganze Zahl umzuwandeln. In der Regel wird diese Funktion in der Netzwerkprogrammierung verwendet, insbesondere wenn sie IP -Adressen speichern oder vergleichen müssen, wodurch IP -Adressen für die einfache Verarbeitung effektiv umwandelt werden können. Aber können wir direkt mathematische Operationen für diese konvertierten Ganzzahlen ausführen? In diesem Artikel werden wir dieses Problem im Detail diskutieren und seine spezifische Situation analysieren.
Die IP2long () -Funktion von PHP wandelt eine IPv4-Adresse in eine 32-Bit-Ganzzahl um. Eine IPv4 -Adresse besteht aus vier Bytes, und IP2long () wird erreicht, indem diese Bytes in die Reihenfolge in Ganzzahlen konvertiert werden.
Nehmen wir beispielsweise an, wir haben die IP -Adresse 192.168.1.1 Die Aufrufen der Funktion ip2long () gibt eine Ganzzahl zurück:
<span><span><span class="hljs-variable">$ip</span></span><span> = </span><span><span class="hljs-string">'192.168.1.1'</span></span><span>;
</span><span><span class="hljs-variable">$long</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ip2long</span></span><span>(</span><span><span class="hljs-variable">$ip</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$long</span></span><span>; </span><span><span class="hljs-comment">// Ausgangsergebnis:3232235777</span></span><span>
</span></span>
Im obigen Beispiel wird 192.168.1.1 in die Integer 3232235777 umgewandelt.
Die Funktion ip2long () gibt eine 32-Bit-Ganzzahl zurück. Nach dem Darstellungsbereich von 32-Bit-Ganzzahlen sollte sein Wert zwischen 0 und 4294967295 liegen. Dies bedeutet, dass das Ergebnis der IP2long () -Werbe eine Ganzzahl größer als Null ist. Um größere Werte zu verarbeiten (z. B. in IPv6), müssen Sie einen anderen Mechanismus verwenden.
Die von ip2long () konvertierte Ganzzahl ist im Wesentlichen eine 32-Bit-Ganzzahl, und solche Ganzzahlen können direkt an mathematischen Operationen in PHP teilnehmen. Der int- Typ von PHP ist eine signierte 32-Bit-Ganzzahl in den meisten Systemen, daher kann er für gemeinsame mathematische Operationen wie Addition, Subtraktion, Multiplikation und Abteilung verwendet werden.
Zum Beispiel können wir die IP-konvertenzahlen hinzufügen oder subtrahieren:
<span><span><span class="hljs-variable">$ip1</span></span><span> = </span><span><span class="hljs-string">'192.168.1.1'</span></span><span>;
</span><span><span class="hljs-variable">$ip2</span></span><span> = </span><span><span class="hljs-string">'192.168.1.2'</span></span><span>;
</span><span><span class="hljs-variable">$long1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ip2long</span></span><span>(</span><span><span class="hljs-variable">$ip1</span></span><span>);
</span><span><span class="hljs-variable">$long2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ip2long</span></span><span>(</span><span><span class="hljs-variable">$ip2</span></span><span>);
</span><span><span class="hljs-variable">$sum</span></span><span> = </span><span><span class="hljs-variable">$long1</span></span><span> + </span><span><span class="hljs-variable">$long2</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$sum</span></span><span>; </span><span><span class="hljs-comment">// Zwei ausgeben IP Die übersetzte Ganzzahl der Adresse</span></span><span>
</span></span>
Diese Art des Betriebs ist gültig, vorausgesetzt, das Ergebnis überschreitet den Darstellungsbereich des PHP -Ganzzentyps nicht. Im Allgemeinen liegen die Berechnungsergebnisse in einem angemessenen Bereich.
Wenn Sie jedoch extrem große Mathematikoperationen ausführen, können Sie PHP -Integer -Überlaufprobleme stoßen. PHP verwendet Ganzzahlen verschiedener Größen in verschiedenen Systemen, normalerweise 32-Bit oder 64-Bit. In etwa 32-Bit-Systemen können ein ganzzahliger Überlauf auftreten, insbesondere wenn es um sehr große Zahlen geht.
Wenn beispielsweise das Ergebnis von Addition oder Multiplikation den Maximalwert einer 32-Bit-Ganzzahl ( 4294967295 ) überschreitet, kann ein Überlauf auftreten, was zu einem falschen Berechnungsergebnis führt. Obwohl die von IP2long () konvertierte Ganzzahl direkt an mathematischen Operationen teilnehmen kann, ist es erforderlich, bei der Durchführung großer Vorgänge auf mögliche Überlaufprobleme zu beachten.
Wenn der Wert einer Ganzzahl den Bereich einer Systembezahlung überschreitet, wandelt PHP ihn automatisch in eine schwimmende Punktzahl um. Dies kann zu einem Genauigkeitsverlust führen, insbesondere bei komplexen Operationen. Zum Beispiel:
<span><span><span class="hljs-variable">$ip1</span></span><span> = </span><span><span class="hljs-string">'255.255.255.255'</span></span><span>;
</span><span><span class="hljs-variable">$ip2</span></span><span> = </span><span><span class="hljs-string">'0.0.0.1'</span></span><span>;
</span><span><span class="hljs-variable">$long1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ip2long</span></span><span>(</span><span><span class="hljs-variable">$ip1</span></span><span>);
</span><span><span class="hljs-variable">$long2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ip2long</span></span><span>(</span><span><span class="hljs-variable">$ip2</span></span><span>);
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$long1</span></span><span> + </span><span><span class="hljs-variable">$long2</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$result</span></span><span>; </span><span><span class="hljs-comment">// Sie können auf Genauigkeitsprobleme stoßen</span></span><span>
</span></span>
Wenn der Ganzzahlwert der IP -Adresse zu groß ist, konvertiert PHP ihn in eine schwimmende Punktzahl. Aufgrund der Genauigkeitsbeschränkung der schwimmenden Punktzahl kann jedoch das endgültige Berechnungsergebnis fehlerhaft sein.
Um den Überlauf und den Präzisionsverlust von Ganzzahl zu vermeiden, können die folgenden Methoden angewendet werden:
Verwenden Sie 64-Bit-Ganzzahlen : Wenn Ihre Umgebung 64-Bit-Ganzzahlen unterstützt, können Sie sicherstellen, dass der Betrieb den Ganzzahl nicht überschreitet. Sie können die Ganzzahlgröße überprüfen, die von der aktuellen PHP -Umgebung über PHP_INT_SIZE unterstützt wird.
<span><span><span class="hljs-keyword">echo</span></span><span> PHP_INT_SIZE; </span><span><span class="hljs-comment">// 4 oder 8,Hängen von der Systemarchitektur ab</span></span><span>
</span></span>
Verwenden Sie GMP- oder BC -Mathematik -Erweiterungen : Für größere Werte liefert PHP GMP- und BC -Bibliotheken zur Erweiterung der Mathematik, die Ganzzahl- und Gleitpunktberechnungen für willkürliche Präzision unterstützen, wodurch Überlauf und Präzisionsverlust vermieden werden.
Beispielsweise kann die Verwendung von GMP_ADD () eine hohe Präzisionsabschluss durchführen:
<span><span><span class="hljs-variable">$gmp1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">gmp_init</span></span><span>(</span><span><span class="hljs-variable">$long1</span></span><span>);
</span><span><span class="hljs-variable">$gmp2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">gmp_init</span></span><span>(</span><span><span class="hljs-variable">$long2</span></span><span>);
</span><span><span class="hljs-variable">$gmpSum</span></span><span> = </span><span><span class="hljs-title function_ invoke__">gmp_add</span></span><span>(</span><span><span class="hljs-variable">$gmp1</span></span><span>, </span><span><span class="hljs-variable">$gmp2</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">gmp_strval</span></span><span>(</span><span><span class="hljs-variable">$gmpSum</span></span><span>);
</span></span>
Nachdem die Funktion ip2long () die IP -Adresse in eine Ganzzahl umwandelt, kann sie normalerweise direkt für mathematische Operationen verwendet werden. In den meisten Fällen überschreiten diese Ganzzahlen nicht den Ganzzahlbereich von PHP, sodass Operationen wie Addition, Subtraktion, Multiplikation und Abteilung durchgeführt werden können. In einigen Fällen, insbesondere bei großen Zahlen, ist es jedoch erforderlich, auf mögliche Überlauf- und Genauigkeitsprobleme zu achten. Um diese Probleme zu vermeiden, sollten Sie die mathematische Erweiterungen von 64-Bit-Ganzzahlen oder PHP wie GMP- oder BC-Mathematik-Erweiterungen in Betracht ziehen, um diese Probleme zu vermeiden.
Durch das Verständnis des PHP -Verarbeitungsmechanismus für Ganzzahlen und die Verwendung der Erweiterungsbibliothek können wir sicherstellen, dass bei der Durchführung mathematischer Operationen nach der IP -Adresskonvertierung keine Fehlerergebnisse aufgrund des Datenüberlaufs oder des Genauigkeitsverlusts vorliegen.