hexdec()
Hoy hablaremos de la función hexdec() en PHP, usada para convertir un número hexadecimal a su equivalente decimal.
La función hexdec() de PHP convierte una cadena hexadecimal (base 16) en su equivalente decimal (base 10). Es la inversa de dechex(), y resulta muy útil cuando se leen valores hex provenientes de colores, volcados de bytes, hashes o protocolos de bajo nivel y se necesita operar aritméticamente con ellos.
Esta página cubre la sintaxis, el tipo de retorno real, cómo maneja hexdec() los caracteres no válidos, el problema con números grandes y cómo se relaciona con las demás funciones de conversión de bases.
Sintaxis
hexdec(string $hex_string): int|float$hex_string— la cadena hexadecimal a convertir. Los dígitos hex son0-9ya-f(sin distinción de mayúsculas/minúsculas, por lo queFFyffson equivalentes).- Valor de retorno — el valor decimal como
int, o comofloatcuando el número es demasiado grande para caber en un entero de PHP.
Un Ejemplo Básico
1a en base 16 significa 1 × 16 + 10 = 26, que es el valor que se imprime. La entrada es una cadena aquí — esa es la forma normal y recomendada de pasar valores hex, ya que un literal como 1a no es PHP válido y 0x1a ya sería un entero.
Conversión de Varios Valores
hexdec() no distingue mayúsculas de minúsculas e ignora cualquier prefijo 0x que puedas copiar desde otra herramienta:
<?php
echo hexdec("ff"), "\n"; // 255
echo hexdec("FF"), "\n"; // 255 (same — case does not matter)
echo hexdec("100"), "\n"; // 256
echo hexdec("7fff"), "\n"; // 32767
echo hexdec("0x1A"), "\n"; // 26 (the "0x" is ignored)
?>Un uso real habitual es dividir un color CSS en hexadecimal en sus canales rojo, verde y azul:
<?php
$color = "ff8800";
$red = hexdec(substr($color, 0, 2)); // 255
$green = hexdec(substr($color, 2, 2)); // 136
$blue = hexdec(substr($color, 4, 2)); // 0
echo "rgb($red, $green, $blue)"; // rgb(255, 136, 0)
?>Cómo Se Manejan los Caracteres No Válidos
hexdec() no lanza un error con una cadena mal formada. En cambio, cada carácter que no sea un dígito hex válido se ignora silenciosamente (y, desde PHP 7.4, se emite un aviso de obsolescencia/E_WARNING). Los dígitos válidos restantes siguen convirtiéndose:
<?php
echo hexdec("a0.5"), "\n"; // 2565 — the "." is dropped, so "a05" is converted
echo hexdec("xyz1f"), "\n"; // 31 — only "1f" is valid hex
?>Dado que el fallo es silencioso, valida la entrada tú mismo cuando pueda ser de origen no confiable. ctype_xdigit() comprueba que una cadena contenga solo dígitos hex:
<?php
$input = "a0.5";
if (ctype_xdigit($input)) {
echo hexdec($input);
} else {
echo "Not a valid hexadecimal string";
}
// Not a valid hexadecimal string
?>Los Números Grandes Devuelven un Float
Los enteros de PHP están limitados por la plataforma (64 bits en la mayoría de sistemas modernos). Cuando un valor hex supera PHP_INT_MAX, hexdec() devuelve un float en lugar de un int para que el valor no se trunque, aunque los floats muy grandes pierden precisión:
<?php
var_dump(hexdec("1a")); // int(26)
var_dump(hexdec("ffffffffffffffff")); // float(1.8446744073709552E+19)
?>Si necesitas aritmética exacta con números hex muy grandes, utiliza las extensiones BCMath o GMP en su lugar.
Funciones de Conversión de Bases Relacionadas
hexdec() es una de las funciones de una familia de conversores de bases. Elige la que coincida con tus bases de entrada y salida:
| Función | Convierte desde | Convierte a |
|---|---|---|
hexdec() | hexadecimal | decimal |
dechex() | decimal | hexadecimal |
bindec() | binario | decimal |
octdec() | octal | decimal |
Para bases arbitrarias (de base 2 a base 36) usa base_convert(), y para convertir una cadena hex en bytes sin procesar utiliza hex2bin().
Conclusión
hexdec() convierte una cadena hexadecimal en un número decimal, devolviendo un int (o un float para valores muy grandes). Recuerda que ignora los caracteres no válidos de forma silenciosa — así que valida la entrada no confiable primero con ctype_xdigit() — y usa su contraparte dechex() para convertir de vuelta.