hexdec()
Рассмотрим функцию hexdec() в PHP, которая преобразует шестнадцатеричное число в его десятичный эквивалент.
Функция PHP hexdec() преобразует шестнадцатеричную (с основанием 16) строку в её десятичный (с основанием 10) эквивалент. Она является обратной функцией dechex() и очень удобна, когда нужно считать шестнадцатеричные значения из цветов, дампов байтов, хешей или низкоуровневых протоколов и выполнять над ними арифметические операции.
На этой странице рассматриваются синтаксис, реальный возвращаемый тип, обработка недопустимых символов, особенность с большими числами и связь hexdec() с другими функциями перевода систем счисления.
Синтаксис
hexdec(string $hex_string): int|float$hex_string— шестнадцатеричная строка для преобразования. Допустимые цифры:0-9иa-f(регистр не важен:FFиff— одно и то же).- Возвращаемое значение — десятичное значение в виде
intлибоfloat, если число слишком велико для PHP-целого.
Базовый пример
1a в шестнадцатеричной системе означает 1 × 16 + 10 = 26 — именно это значение и выводится. Входной параметр здесь — строка: это нормальный и рекомендуемый способ передачи шестнадцатеричных значений, потому что литерал вроде 1a не является допустимым кодом PHP, а 0x1a уже является целым числом.
Преобразование нескольких значений
hexdec() не чувствителен к регистру и игнорирует префикс 0x, который может встретиться при копировании из другого инструмента:
<?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)
?>Типичный практический пример — разбиение CSS-цвета в шестнадцатеричном формате на каналы красного, зелёного и синего:
<?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)
?>Обработка недопустимых символов
hexdec() не выбрасывает ошибку при некорректной строке. Вместо этого каждый символ, не являющийся допустимой шестнадцатеричной цифрой, молча игнорируется (а начиная с PHP 7.4 выводится уведомление об устаревании / E_WARNING). Оставшиеся допустимые цифры всё равно преобразуются:
<?php
echo hexdec("a0.5"), "\n"; // 2565 — the "." is dropped, so "a05" is converted
echo hexdec("xyz1f"), "\n"; // 31 — only "1f" is valid hex
?>Поскольку ошибка обрабатывается молча, при работе с ненадёжными данными проверяйте ввод самостоятельно. Функция ctype_xdigit() проверяет, содержит ли строка только шестнадцатеричные цифры:
<?php
$input = "a0.5";
if (ctype_xdigit($input)) {
echo hexdec($input);
} else {
echo "Not a valid hexadecimal string";
}
// Not a valid hexadecimal string
?>Большие числа возвращают float
PHP-целые числа ограничены платформой (64 бита на большинстве современных систем). Если шестнадцатеричное значение превышает PHP_INT_MAX, hexdec() возвращает float вместо int, чтобы значение не обрезалось, — хотя очень большие числа с плавающей точкой теряют точность:
<?php
var_dump(hexdec("1a")); // int(26)
var_dump(hexdec("ffffffffffffffff")); // float(1.8446744073709552E+19)
?>Если требуется точная арифметика с очень большими шестнадцатеричными числами, используйте расширения BCMath или GMP.
Связанные функции перевода систем счисления
hexdec() входит в семейство функций перевода систем счисления. Выберите ту, которая соответствует вашим входным и выходным основаниям:
| Функция | Преобразует из | Преобразует в |
|---|---|---|
hexdec() | шестнадцатеричной | десятичную |
dechex() | десятичной | шестнадцатеричную |
bindec() | двоичной | десятичную |
octdec() | восьмеричной | десятичную |
Для произвольных оснований (от 2 до 36) используйте base_convert(), а для преобразования шестнадцатеричной строки в сырые байты — hex2bin().
Заключение
hexdec() преобразует шестнадцатеричную строку в десятичное число, возвращая int (или float для очень больших значений). Помните, что функция молча игнорирует недопустимые символы — поэтому сначала проверяйте ненадёжные данные с помощью ctype_xdigit() — и используйте обратную функцию dechex() для обратного преобразования.