Maison >développement back-end >tutoriel php >Solution aux nombres négatifs lorsque php utilise ip2long

Solution aux nombres négatifs lorsque php utilise ip2long

*文
*文original
2018-01-02 17:16:001869parcourir

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 = &#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.

Lorsque l'adresse IP est relativement grande, ip2long aura un nombre négatif :

<?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
?>

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 = &#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
?>

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn