Hexdec: примеры (PHP)
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() является более семантически ясной для этой конкретной задачи.
Аналоги в других языках
Используется функция int() с указанием основания 16.
print(int("1a", 16))
print(int("0xFF", 0)) # Префикс 0x распознается автоматически с base=026 255
Используется функция parseInt() с указанием основания 16.
console.log(parseInt("1a", 16));
console.log(parseInt("0xFF")); // Строки, начинающиеся с '0x', распознаются как шестнадцатеричные26 255
Используется функция CONV() для преобразования между системами счисления или операция +0 в контексте числа.
SELECT CONV('1a', 16, 10);
SELECT 0x1A + 0;26 26
В 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. Ранее аргумент неявно преобразовывался в строку.
Расширенные примеры
<?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
)<?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
$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
// На 64-битной системе или PHP 8.1+ на 32-битной
$bigHex = 'FFFFFFFFFFFFFF'; // Большое число
$result = hexdec($bigHex);
var_dump($result);
var_dump(is_float($result));
?>float(7.2057594037928e+16) bool(true)