Lorsque vous travaillez avec des cordes hexadécimales, PHP fournit une fonction intégrée hexdec () qui convertit les nombres hexadécimaux en décimal. Cependant, lors de l'utilisation de hexdec () , de nombreux développeurs entreront inconsciemment une chaîne avec le préfixe "0x" (comme "0xFF" ), mais constatent que la valeur retournée n'est pas le 255 attendu, mais 0. Cette situation rend souvent les gens confus: il s'agit clairement d'un nombre hexadécimal juridique, pourquoi le résultat est-il important?
Cet article analysera ce phénomène en profondeur et fournira la bonne façon de l'utiliser.
La fonction hexdec () de PHP est conçue pour gérer les "chaînes hexagonales pures", c'est-à-dire qu'elle accepte uniquement des caractères tels que 0–9 et A - F (cas insensible) en entrée. Si la chaîne passée contient du contenu qui n'appartient pas au jeu de caractères hexadécimal, PHP se lira depuis le début de la chaîne jusqu'à ce que le premier caractère illégal soit rencontré, puis tronque et convertit la partie légitime précédente.
<?php
echo hexdec("FF"); // Sortir: 255
?>
Il s'agit d'un exemple typique qui répond aux attentes.
Voyons maintenant la cause profonde du problème:
<?php
echo hexdec("0xFF"); // Sortir: 0
?>
À l'heure actuelle, la sortie n'est pas 255, mais 0. La raison est simple: hexdec () arrêtera l'analyse lorsqu'elle rencontrera le premier caractère illégal, et le premier caractère de la chaîne "0xff" est 0 , ce qui est légal; Le deuxième caractère est X , qui est un caractère hexadécimal illégal. Par conséquent, PHP analyse uniquement le premier caractère 0 , il renvoie donc 0.
Dans de nombreux langages de programmation (tels que C / C ++, JavaScript, Python), la méthode d'écriture avec le préfixe "0x" est un format hexadécimal légal. Par conséquent, certains développeurs passeront naturellement "0xFF" à HexDec () de PHP comme une entrée légale, sans se rendre compte que PHP ne reconnaît pas ce préfixe.
Une solution générale et simple consiste à utiliser ltrim () pour traiter la chaîne, supprimant les préfixes "0x" ou "0x" possibles:
<?php
$input = "0xFF";
$clean = ltrim($input, "0xX"); // Supprimera tout "0", "x", "X" Personnages de départ(Inexacte)
echo hexdec($clean); // Sortir: 255
?>
Mais il y a aussi des pièges dans cette manière d'écrire, car ltrim ("0x0f", "0xx") obtiendra "f" , qui peut ne pas être ce que nous voulons. Un moyen plus sûr consiste à utiliser prég_replace () pour supprimer exactement le préfixe:
<?php
$input = "0xFF";
$clean = preg_replace('/^0x/i', '', $input);
echo hexdec($clean); // Sortir: 255
?>
Cela ne supprimera que le début "0x" ou "0x" sans détruire le nombre lui-même.
Si vous rencontrez des chaînes hexadécimales lors du traitement des paramètres dans l'URL, en particulier à partir d'adresses comme https://gitbox.net/api?color=0xff00ff , une attention particulière doit être accordée à:
<?php
$hex = $_GET['color']; // Par exemple: 0xFF00FF
$hex = preg_replace('/^0x/i', '', $hex);
$decimal = hexdec($hex);
echo $decimal; // Sortir: 16711935
?>
Cela garantit que vous pouvez analyser correctement les numéros hexadécimaux avec le préfixe "0x" .
HexDec () de PHP ne reconnaît pas le préfixe "0x" , il ne traite que la chaîne comme une collection de caractères hexadécimaux purs. Par conséquent, avant d'utiliser hexdec () , les développeurs doivent nettoyer manuellement la chaîne et supprimer le préfixe "0x" pour éviter d'obtenir de mauvaises valeurs. Comprendre et gérer ce détail est la clé pour assurer la précision des programmes PHP.