Dans la programmation PHP, HexDec () est une fonction très pratique qui convertit les cordes hexadécimales en valeurs décimales correspondantes. Plusieurs fois, nous l'utilisons pour traiter le code couleur, le codage et le décodage ou le traitement des valeurs de registre matériel. Mais une question courante est: l'utilisation de hexdec () provoquera-t-elle un débordement entier? ** Cet article effectuera une analyse approfondie du problème de débordement entier que hexdec () peut provoquer et vous apprendre à l'identifier et à le contourner efficacement.
Le débordement entier fait référence à une valeur entière dépassant la plage maximale que son type de données peut représenter, ce qui fait que la valeur "enroule" ou devient un nombre négatif incorrect. En PHP, la taille d'un entier est déterminée par l'architecture du système:
Système 32 bits: L'entier maximum est d'environ 231-1 (2147483647)
Système 64 bits: L'entier maximum est d'environ 2? 3-1 (9223372036854775807)
Si la valeur convertie dépasse cette plage, un débordement peut se produire.
La définition de hexdec () est simple:
$decimal = hexdec('FF'); // 255
Il accepte une chaîne hexadécimale et renvoie un numéro de point flottant décimal ou un entier. En fait, PHP renvoie un numéro de point flottant lors du traitement des entrées HexDec () plus grandes que la plage entière.
Exemple:
<?php
// 32 Sous le système de bits,Entier maximum 0x7FFFFFFF = 2147483647
echo hexdec('7FFFFFFF') . "\n"; // 2147483647,Entier normal
echo hexdec('80000000') . "\n"; // 2147483648,Plus que32Gamme bit entière,Renvoie un numéro de point flottant
?>
Sur les systèmes 64 bits, cette gamme sera plus grande, mais toujours limitée.
Si la valeur représentée par la chaîne hexadécimale dépasse le maximum entier du système actuel, PHP convertit la valeur de retour en un numéro de point flottant. Bien que les nombres à virgule flottante puissent représenter une portée plus grande, leur précision est limitée, ce qui peut entraîner une perte de précision.
Par exemple:
<?php
var_dump(hexdec('FFFFFFFFFFFFFFFF')); // 64La valeur maximale non signée du bit
?>
Sortir:
float(1.8446744073709552E+19)
Il s'agit d'un numéro de point flottant qui a dépassé la plage maximale des entiers signés PHP.
Remarque : Si vous attendez un entier précis, il y aura un problème de précision ici.
La clé pour identifier le risque de débordement est de déterminer si la valeur correspondant à la chaîne hexadécimale d'entrée dépasse la plage entière du système. Il peut être jugé en comparant la longueur de la chaîne ou en utilisant la fonction BC Series.
Exemple:
<?php
function willOverflow($hexString) {
$maxInt = PHP_INT_MAX;
// 将Entier maximum转为hexadécimal
$maxHex = dechex($maxInt);
// Les cordes hexadécimales ignorent le cas,Comparaison de la longueur et de l'ordre du dictionnaire
$hexString = strtolower($hexString);
$maxHex = strtolower($maxHex);
if (strlen($hexString) > strlen($maxHex)) {
return true; // La longueur dépasse,Doit déborder
} elseif (strlen($hexString) < strlen($maxHex)) {
return false; // De toute évidence, pas de débordement
} else {
// Durée égale,Ordonnance du dictionnaire de comparaison
return strcmp($hexString, $maxHex) > 0;
}
}
// test
var_dump(willOverflow('7FFFFFFF')); // false
var_dump(willOverflow('80000000')); // true
?>
Utilisation du traitement des chaînes ou des fonctions de grand nombre <br> Pour les nombres hexadécimaux qui peuvent déborder, il est recommandé d'utiliser l'extension BCMATH ou l'extension GMP de PHP:
<?php
$hex = 'FFFFFFFFFFFFFFFF';
$decimal = gmp_strval(gmp_init($hex, 16), 10);
echo $decimal . "\n";
?>
GMP_INIT peut traiter avec précision les nombres de tailles arbitraires, évitant le débordement et la perte de précision.
Limiter la plage d'entrée <br> Si votre programme n'a besoin que de traiter les nombres hexadécimaux dans une certaine plage, vous pouvez vérifier lors de la saisie et rejeter des données qui dépassent la plage.
Comprendre l'utilisation de valeurs numériques <br> Si la valeur est uniquement utilisée pour l'affichage ou le stockage en tant que chaîne, utilisez simplement hexdec () pour le convertir en un numéro de point flottant. S'il est utilisé dans les opérations mathématiques, il doit être manipulé avec prudence.
hexdec () lui-même ne déborde pas directement, mais renverra un numéro de point flottant lorsque le nombre dépasse la plage entière, ce qui peut entraîner une perte de précision.
Pour déterminer si le débordement peut être comparé à la taille de la valeur hexadécimale avec l'entier maximum du système via une chaîne.
Pour un grand nombre, il est recommandé d'utiliser BCMATH ou GMP pour une manipulation sûre.
Dans les scénarios clés, les restrictions d'entrée et la vérification des types sont des moyens importants pour éviter le débordement.
La maîtrise de ces connaissances vous permet d'éviter des problèmes de débordement entiers "invisibles" lorsqu'ils traitent des numéros hexadécimaux et d'écriture du code PHP plus robuste.
<?php
// Démo gmp S'étendre pour éviter le débordement
$hex = 'FFFFFFFFFFFFFFFF'; // Dépasser 64 Range entier signé de bits
$decimal = gmp_strval(gmp_init($hex, 16), 10);
echo "hexadécimal $hex Convertir en décimal est:$decimal\n";
// utiliser hexdec Possible d'obtenir des numéros de points flottants,Précision limitée
$floatValue = hexdec($hex);
echo "utiliser hexdec La valeur obtenue:$floatValue\n";
?>