Heim  >  Artikel  >  Backend-Entwicklung  >  Lösung für negative Zahlen, wenn PHP ip2long verwendet

Lösung für negative Zahlen, wenn PHP ip2long verwendet

*文
*文Original
2018-01-02 17:16:001819Durchsuche

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 = &#39;10.1.1.1&#39;;
$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 = &#39;192.168.101.100&#39;;
$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 = &#39;192.168.101.100&#39;;
$ip_long = sprintf(&#39;%u&#39;,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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn