base_convert()
Функция base_convert() в PHP преобразует число из одной системы счисления в другую — от двоичной до тридцатишестеричной.
Функция base_convert() преобразует число из одной системы счисления в другую — например, из десятичной (основание 10) в двоичную (основание 2) или из шестнадцатеричной (основание 16) обратно в десятичную. Это наиболее универсальная из вспомогательных функций PHP для работы с основаниями систем счисления: она поддерживает любое основание от 2 до 36, тогда как такие функции, как dechex() или bindec(), привязаны к конкретной паре оснований.
На этой странице описаны синтаксис, допустимый диапазон оснований, набор запускаемых примеров, подводные камни (регистр букв, дробные числа, ограничения точности), а также случаи, когда лучше использовать более специализированную функцию.
Синтаксис
base_convert(string $num, int $from_base, int $to_base): string| Параметр | Описание |
|---|---|
$num | Число для преобразования, заданное как string (целое число также принимается и приводится к string). |
$from_base | Основание, в котором записано $num. Должно быть от 2 до 36. |
$to_base | Основание, в которое нужно преобразовать $num. Должно быть от 2 до 36. |
Возвращаемое значение: преобразованное число в виде string, всегда в нижнем регистре. Для оснований выше 10 используются буквы a–z для цифр 10–35 (так, основание 16 использует 0-9 и a-f, а основание 36 использует 0-9 и a-z).
Базовый пример
Наиболее распространённый случай — преобразование десятичного числа в двоичное:
Десятичное 10 преобразуется в string "1010" в двоичной системе. Обратите внимание: результат является string, а не целым числом — имейте это в виду, если планируете выполнять арифметические операции с результатом.
Преобразование между распространёнными системами счисления
Та же функция работает с шестнадцатеричной, восьмеричной и любой другой системой счисления в этом диапазоне. Ниже приведены несколько преобразований рядом:
<?php
echo base_convert("ff", 16, 10), "\n"; // hex -> decimal: 255
echo base_convert("255", 10, 16), "\n"; // decimal -> hex: ff
echo base_convert("777", 8, 10), "\n"; // octal -> decimal: 511
echo base_convert("a37334", 16, 2), "\n";// hex -> binary
echo base_convert("zz", 36, 10), "\n"; // base 36 -> decimal: 1295
?>Это выведет:
255
ff
511
101000110111001100110100
1295Поскольку base_convert() понимает оба конца преобразования, не нужно выполнять два отдельных вызова, чтобы, например, перейти из шестнадцатеричной системы в двоичную.
На что следует обратить внимание
- Регистр нормализуется. Входные буквы могут быть в верхнем или нижнем регистре (
"FF"и"ff"оба работают), но результат всегда в нижнем регистре. - Дробные числа не поддерживаются.
base_convert()работает только с целыми числами. Значение вроде"12.34"— его.трактуется как недопустимый символ: он отбрасывается, и преобразуются только цифры (в PHP 8.1+ игнорируемые символы вызывают уведомление об устаревании). - Недопустимые цифры игнорируются. Символ, недопустимый в
$from_base(например,9при$from_baseравном 8), молча отбрасывается без вызова ошибки — поэтому сначала следует проверять входные данные. - Точность ограничена. Внутренне значение обрабатывается как число с плавающей точкой. Очень большие целые числа могут потерять точность и дать неточный результат. Для точного преобразования оснований с произвольной точностью используйте расширение GMP и функцию
gmp_init()с указанием основания.
Когда использовать более специализированную функцию
Если вы всегда конвертируете из или в основание 10, специализированные функции нагляднее и чуть быстрее:
dechex()/hexdec()— десятичная ⇄ шестнадцатеричнаяdecbin()/bindec()— десятичная ⇄ двоичнаяdecoct()/octdec()— десятичная ⇄ восьмеричная
Используйте base_convert(), когда ни одно из оснований не равно 10 (например, шестнадцатеричная → двоичная) или когда основание нестандартное, как основание 36 (часто используется для коротких, удобных для URL идентификаторов).
Заключение
base_convert() — универсальный инструмент PHP для перевода целых чисел между любыми двумя системами счисления от основания 2 до основания 36. Помните, что функция возвращает string в нижнем регистре, игнорирует дроби и недопустимые цифры, а также ограничена точностью числа с плавающей точкой для очень больших значений. Для стандартных преобразований из десятичной системы в другую лучше использовать специализированные вспомогательные функции dec*() / *dec().