W3docs

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-целого.

Базовый пример

php— editable, runs on the server

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() для обратного преобразования.

Практика

Практика
Что делает функция PHP hexdec?
Что делает функция PHP hexdec?
Was this page helpful?