Solution aux nombres négatifs lorsque php utilise ip2long

*文
Libérer: 2023-03-19 06:04:01
original
1767 Les gens l'ont consulté

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
?>
Copier après la connexion

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
?>
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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
?>
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!