Maison >développement back-end >tutoriel php >Solution aux nombres négatifs lorsque php utilise ip2long
Comment résoudre le problème des nombres négatifs lors de l'utilisation d'ip2long en PHP ? Cet article présente principalement les raisons et les solutions aux nombres négatifs dans php ip2long. Partagez-le avec tout le monde et donnez-le comme référence. J'espère que cela aide tout le monde.
php fournit les méthodes ip2long et long2ip pour traiter les adresses IP.
1. ip2long - Convertir un protocole Internet de chaîne IPV4 en format numérique
int ip2long ( string $ip_address )
Paramètres : ip_address Une adresse dans un format standard.
Valeur de retour : Renvoie le numéro converti de l'adresse IP ou FALSE si ip_address n'est pas valide.
2. long2ip — Convertissez le format numérique en un protocole Internet de chaîne IPV4
string long2ip ( string $proper_address )
Paramètre : proper_address La représentation correcte de l'adresse d'un entier long.
Valeur de retour : Renvoie l'adresse Internet sous forme de chaîne.
3. Comment utiliser
<?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.
Lorsque l'adresse IP est relativement grande, ip2long aura un nombre négatif :
<?php $ip = '192.168.101.100'; $ip_long = ip2long($ip); echo $ip_long.PHP_EOL; // -1062705820 echo long2ip($ip_long); // 192.168.101.100 ?>
Explication de la raison :
IPv4 En utilisant des adresses 32 bits non signées, il y a au plus 2 puissances 32 moins 1 (4294967295) adresses. Écrivez des nombres décimaux séparés par 4 points décimaux.
est enregistré comme A.B.C.D, par exemple : 192.168.100.100.
Chaque nombre décimal dans l'adresse IPv4 est un octet non signé, allant de 0 à 255. Convertir l'adresse IPv4 en un nombre non signé signifie en fait placer chaque nombre décimal dans les 8 bits correspondants, formant un nombre non signé de 4 octets. entier. 192.168.100.100, 192 168 dans les 8 chiffres supérieurs et 100 100 dans les 8 chiffres inférieurs.
Exemple d'implémentation C :
#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
Comme vous pouvez le voir, même si la déclaration ip_long est un entier non signé, elle a toujours besoin à spécifier lors de la sortie de %u pour formater la sortie comme un entier non signé.
Parce que 192 est supérieur à 127 (le binaire est 01111111), 192 (8 bits) est exprimé en binaire et le bit le plus élevé doit être 1. Par conséquent, le bit le plus élevé de cet entier de 4 octets est 1.
Bien que ip_long soit défini comme un entier non signé, la méthode printf ignore la déclaration. Vous devez donc utiliser le formatage %u pour la sortie. Si le bit le plus élevé est 0, utilisez simplement %d.
Autre exemple :
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
Solution :
Utilisez %u pour le formater comme un entier non signé lors de la sortie.
<?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 ?>
Recommandations associées :
Comment obtenir la véritable adresse IP du client utilisateur en PHP
PHP implémente le cryptage d'images salées
Comment PHP gère les connexions mortes MySQL
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!