Heim > Artikel > Backend-Entwicklung > Lösung für negative Zahlen, wenn PHP ip2long verwendet
Wie löst man das Problem negativer Zahlen bei der Verwendung von ip2long in PHP? In diesem Artikel werden hauptsächlich die Gründe und Lösungen für negative Zahlen in PHP ip2long vorgestellt. Teilen Sie es mit allen und geben Sie es als Referenz weiter. Ich hoffe, es hilft allen.
php bietet ip2long- und long2ip-Methoden zur Verarbeitung von IP-Adressen.
1. ip2long – Konvertieren eines IPV4-String-Internetprotokolls in ein digitales Format
int ip2long ( string $ip_address )
Parameter: ip_address Eine Adresse in einem Standardformat.
Rückgabewert: Gibt die konvertierte Nummer der IP-Adresse oder FALSE zurück, wenn ip_address ungültig ist.
2. long2ip – Konvertieren Sie das digitale Format in ein IPV4-String-Internetprotokoll
string long2ip ( string $proper_address )
Parameter: proper_address Die korrekte Adressdarstellung einer langen Ganzzahl.
Rückgabewert: Gibt die Internetadresse als String zurück.
3. Verwendung von
<?php $ip = '10.1.1.1'; $ip_long = ip2long($ip); echo $ip_long.PHP_EOL; // 167837953 echo long2ip($ip_long); // 10.1.1.1 ?>
4. Gründe für negative Zahlen und wie man damit umgeht
Wenn die IP-Adresse relativ groß ist, hat ip2long eine negative Zahl:
<?php $ip = '192.168.101.100'; $ip_long = ip2long($ip); echo $ip_long.PHP_EOL; // -1062705820 echo long2ip($ip_long); // 192.168.101.100 ?>
Erklärung des Grundes:
IPv4 Bei Verwendung von vorzeichenlosen 32-Bit-Adressen gibt es höchstens 2 hoch 32 minus 1 (4294967295) Adressen. Schreiben Sie Dezimalzahlen, getrennt durch 4 Dezimalstellen.
wird als A.B.C.D aufgezeichnet, zum Beispiel: 192.168.100.100.
Jede Dezimalzahl in der IPv4-Adresse ist ein vorzeichenloses Byte im Bereich von 0 bis 255. Die Konvertierung der IPv4-Adresse in eine vorzeichenlose Zahl bedeutet eigentlich, jede Dezimalzahl in den entsprechenden 8 Bits zu platzieren, wodurch ein 4-Byte-Byte ohne Vorzeichen entsteht ganze Zahl. 192.168.100.100, 192.168 in den hohen 8 Ziffern und 100.100 in den niedrigen 8 Ziffern.
Beispiel für eine C-Implementierung:
#include <stdio.h> int main(int argc, char** argv) { unsigned int ip_long = (192 << 24) | (168 << 16) | (100 << 8) | 100; printf("%u\n", ip_long); printf("%d\n", ip_long); return 0; } fdipzone@ubuntu:~/C$ gcc -o ip2long ip2long.c fdipzone@ubuntu:~/C$ ./ip2long 3232261220 -1062706076
Wie Sie sehen können, ist die ip_long-Deklaration auch dann noch erforderlich, wenn sie eine vorzeichenlose Ganzzahl ist muss bei der Ausgabe von %u angegeben werden, um die Ausgabe als vorzeichenlose Ganzzahl zu formatieren.
Da 192 größer als 127 ist (binär ist 01111111), wird 192 (8 Bits) binär ausgedrückt und das höchste Bit muss 1 sein. Das höchste Bit dieser 4-Byte-Ganzzahl ist daher 1.
Obwohl ip_long als vorzeichenlose Ganzzahl definiert ist, ignoriert die printf-Methode die Deklaration. Daher müssen Sie für die Ausgabe die %u-Formatierung verwenden. Wenn das höchste Bit 0 ist, verwenden Sie einfach %d.
Ein weiteres Beispiel:
ip:112.24.55.99 #include <stdio.h> int main(int argc, char** argv) { unsigned int ip_long = (112 << 24) | (24 << 16) | (55 << 8) | 99; printf("%u\n", ip_long); printf("%d\n", ip_long); return 0; } fdipzone@ubuntu:~/C$ gcc -o ip2long ip2long.c fdipzone@ubuntu:~/C$ ./ip2long 1880635235 1880635235
Lösung:
Verwenden Sie %u, um es bei der Ausgabe als vorzeichenlose Ganzzahl zu formatieren.
<?php $ip = '192.168.101.100'; $ip_long = sprintf('%u',ip2long($ip)); echo $ip_long.PHP_EOL; // 3232261476 echo long2ip($ip_long); // 192.168.101.100 ?>
Verwandte Empfehlungen:
So erhalten Sie die echte IP des Benutzer-Clients in PHP
PHP implementiert Salted-Image-Verschlüsselung
Wie PHP mit MySQL-toten Verbindungen umgeht
Das obige ist der detaillierte Inhalt vonLösung für negative Zahlen, wenn PHP ip2long verwendet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!