Hexdec: примеры (PHP)

Преобразование шестнадцатеричных строк: работа с функцией hexdec
Раздел: Преобразование типов/форматов
hexdec(string $hex_string): int|float

Функция hexdec

Функция hexdec() преобразует строку, содержащую шестнадцатеричное представление числа, в целое число десятичной системы счисления (integer).

Когда используется

Функция применяется, когда требуется преобразовать данные из шестнадцатеричного формата, который часто используется в программировании для представления цветов, адресов памяти, хэшей или бинарных данных в читаемом виде.

Аргументы функции

Функция принимает один обязательный параметр:

  • $hex_string (string) - Строка, содержащая шестнадцатеричное представление числа. Может начинаться с символов 0x или без них. Регистр символов A-F не имеет значения. Любые не шестнадцатеричные символы в строке игнорируются функцией, начиная с PHP 7.4.0.

Функция возвращает десятичное целое число (int). Для 32-битных систем максимальное возвращаемое значение зависит от платформы. В 64-битных системах и с PHP 8.1.0, для больших чисел может возвращаться число типа float.

Примеры использования

Базовое преобразование
<?php
var_dump(hexdec("1a"));
var_dump(hexdec("FF"));
var_dump(hexdec("0xFF"));
?>
int(26)
int(255)
int(255)
Большие числа и регистр символов
<?php
var_dump(hexdec("ffffffff")); // На 32-битной системе
var_dump(hexdec("AaBbCc"));
?>
float(4294967295) // или int(-1) на 32-битных системах до PHP 8.1.0
int(11189196)
Строки с недопустимыми символами
<?php
// С PHP 7.4.0 символы, не являющиеся шестнадцатеричными, игнорируются с момента их появления.
var_dump(hexdec("1ag")); // 'g' не шестнадцатеричный символ
var_dump(hexdec("1a3\n")); // Перевод строки также игнорируется
?>
int(26)
int(419)

Похожие функции в PHP

  • dechex() - выполняет обратное преобразование: из десятичного числа в шестнадцатеричную строку. Используется, когда нужно получить шестнадцатеричное представление.
  • bindec(), decbin() - функции для работы с двоичной системой счисления.
  • octdec(), decoct() - функции для работы с восьмеричной системой счисления.
  • base_convert() - конвертирует числа между произвольными системами счисления (от 2 до 36). Более универсальная, но для преобразования из шестнадцатеричной в десятичную hexdec() работает быстрее и проще в использовании.
  • intval($string, 16) - также может преобразовать шестнадцатеричную строку в целое число, если указать основание системы счисления 16. Функция hexdec() является более семантически ясной для этой конкретной задачи.

Аналоги в других языках

Python

Используется функция int() с указанием основания 16.

print(int("1a", 16))
print(int("0xFF", 0))  # Префикс 0x распознается автоматически с base=0
26
255
JavaScript

Используется функция parseInt() с указанием основания 16.

console.log(parseInt("1a", 16));
console.log(parseInt("0xFF")); // Строки, начинающиеся с '0x', распознаются как шестнадцатеричные
26
255
MySQL

Используется функция CONV() для преобразования между системами счисления или операция +0 в контексте числа.

SELECT CONV('1a', 16, 10);
SELECT 0x1A + 0;
26
26
Отличия от PHP

В Python и JavaScript преобразование происходит в рамках численного типа языка (часто с неявной поддержкой больших чисел), а в PHP до версии 8.1.0 на 32-битных платформах могло происходить переполнение с получением отрицательного числа. Поведение при встрече недопустимых символов также может различаться.

Типичные ошибки

Некорректный тип аргумента

Передача не строки приводит к предупреждению и преобразованию аргумента в строку.

<?php
// До PHP 8.0.0
var_dump(hexdec(123)); // Число будет преобразовано в строку "123"
?>
Warning: hexdec() expects parameter 1 to be string, int given...
int(291)
Ожидание отрицательного числа

Функция не предназначена для преобразования шестнадцатеричного представления отрицательных чисел в отрицательное целое. Строка интерпретируется как беззнаковое число.

<?php
// Это не даст -26
var_dump(hexdec("-1a"));
?>
int(0) // Преобразование останавливается на первом невалидном символе '-'
Пустая строка
<?php
var_dump(hexdec(""));
?>
int(0)

Изменения в последних версиях PHP

  • PHP 7.4.0: Недопустимые символы теперь молча игнорируются, начиная с первой встречи такого символа. Ранее функция могла возвращать 0 или частичный результат в зависимости от платформы.
  • PHP 8.1.0: Изменено поведение при переполнении. На 32-битных системах функция теперь возвращает число типа float для значений, превышающих PHP_INT_MAX, вместо возврата целого числа с переносом (которое часто было отрицательным). Это изменение делает поведение консистентным на 32-битных и 64-битных платформах.
  • PHP 8.0.0: Вызов функции с аргументом не типа string теперь вызывает ошибку уровня E_WARNING. Ранее аргумент неявно преобразовывался в строку.

Расширенные примеры

Парсинг HEX цвета для CSS
Пример php
<?php
function hexColorToRgb($hex) {
    $hex = ltrim($hex, '#');
    if (strlen($hex) == 3) {
        $hex = $hex[0].$hex[0].$hex[1].$hex[1].$hex[2].$hex[2];
    }
    $r = hexdec(substr($hex, 0, 2));
    $g = hexdec(substr($hex, 2, 2));
    $b = hexdec(substr($hex, 4, 2));
    return [$r, $g, $b];
}
print_r(hexColorToRgb('#FF9933'));
print_r(hexColorToRgb('#f93')); // Сокращенная запись
?>
Array
(
    [0] => 255
    [1] => 153
    [2] => 51
)
Array
(
    [0] => 255
    [1] => 153
    [2] => 51
)
Сравнение производительности с intval
Пример php
<?php
$hex = 'abcdef1234567890';
$start = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
    $val = hexdec($hex);
}
$time1 = microtime(true) - $start;
$start = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
    $val = intval($hex, 16);
}
$time2 = microtime(true) - $start;
echo "hexdec: $time1 сек.\n";
echo "intval: $time2 сек.\n";
?>
hexdec: 0.125 сек.
intval: 0.183 сек.
Преобразование данных из шестнадцатеричного дампа
Пример php
<?php
$hexDump = "48 65 6C 6C 6F 20 57 6F 72 6C 64"; // "Hello World" в HEX
$bytes = explode(' ', $hexDump);
$string = '';
foreach ($bytes as $byte) {
    $string .= chr(hexdec($byte));
}
echo $string;
?>
Hello World
Работа с большими числами в PHP 8.1+
Пример php
<?php
// На 64-битной системе или PHP 8.1+ на 32-битной
$bigHex = 'FFFFFFFFFFFFFF'; // Большое число
$result = hexdec($bigHex);
var_dump($result);
var_dump(is_float($result));
?>
float(7.2057594037928e+16)
bool(true)

PHP hexdec function comments

En
Hexdec Hexadecimal to decimal