Bindec: примеры (PHP)
bindec(string $binary_string): int|floatФункция bindec в PHP
Функция bindec выполняет преобразование строки, представляющей двоичное число, в ее десятичный эквивалент. Это встроенная функция в PHP, относящаяся к категории математических операций. Основное применение – обработка данных, представленных в двоичном формате, например, при работе с битовыми масками, низкоуровневыми протоколами или при конвертации числовых систем счисления.
Функция принимает один обязательный аргумент:
- binary_string (строка) – аргумент, содержащий символы '0' и '1', которые интерпретируются как двоичное число. Строка может быть сколь угодно длинной. Если в строке встречаются другие символы, функция прекращает преобразование на первом недопустимом символе. Пробелы и другие разделители также считаются недопустимыми символами.
Возвращаемое значение – целое число типа int или число с плавающей точкой типа float для очень больших значений, превышающих максимальный размер целого числа на текущей платформе.
Примеры использования bindec
Преобразование простых двоичных строк:
echo bindec('1010');10
echo bindec('1111');15
Работа с длинными двоичными строками:
$large = bindec('1111111111111111111111111111111');
echo $large;2147483647
Функция останавливается на первом недопустимом символе:
echo bindec('10102');10
echo bindec('10 10');2
Похожие функции в PHP
Функция decbin выполняет обратное преобразование – из десятичного числа в двоичную строку. Используется, когда требуется получить двоичное представление числа.
Функции hexdec и dechex работают с шестнадцатеричной системой счисления. Аналогично, octdec и decoct предназначены для восьмеричной системы. Выбор функции зависит от исходного формата данных.
Функция base_convert позволяет конвертировать числа между произвольными системами счисления (от 2 до 36). Более универсальна, но может быть менее эффективна для конкретных преобразований, таких как двоичная-десятичная.
Аналоги функции в других языках
Bindec в Python
В Python для преобразования используется функция int() с указанием основания системы счисления.
int('1010', 2)10
Bindec в Javascript
В JavaScript применяется глобальная функция parseInt() с указанием radix (основания).
parseInt('1010', 2);10
Bindec в MySQL
В MySQL есть функция CONV(), которая может конвертировать числа между разными системами счисления.
SELECT CONV('1010', 2, 10);10
Основное отличие PHP-функции bindec – ее специализация исключительно на двоичных строках и автоматическое определение пределов целочисленного типа.
Типичные ошибки при использовании bindec
Преобразование прекращается на первом символе, не являющемся '0' или '1'. Это может привести к неочевидным результатам, если строка не прошла валидацию.
echo bindec('1010a');10
На 32-битных системах максимальное значение целого числа ограничено. При превышении этого предела функция возвращает число с плавающей точкой, что может привести к потере точности.
echo bindec('111111111111111111111111111111111'); // 33 единицы
// На 32-битной системеfloat(8589934591)
Разработчики иногда забывают, что результат может быть float, и используют его в контексте, требующем целых чисел, что вызывает предупреждения или ошибки.
Изменения в функции в последних версиях PHP
В PHP 8.0 функция bindec не претерпела значительных изменений в поведении. Однако, в рамках общего ужесточения типизации в PHP 8, передача неверных типов аргументов (например, массива или объекта) теперь вызывает ошибку TypeError, в отличие от более ранних версий, где такие аргументы могли молчаливо преобразовываться.
// PHP 7
var_dump(bindec(['1010']));Warning: bindec() expects parameter 1 to be string, array given NULL
// PHP 8
try {
bindec(['1010']);
} catch (TypeError $e) {
echo $e->getMessage();
}bindec(): Argument #1 ($binary_string) must be of type string, array given
Расширенные примеры использования bindec
Функция удобна для декодирования битовых масок, например, при анализе прав доступа.
$permissions = bindec('1101');
$canRead = ($permissions & bindec('1000')) != 0;
$canWrite = ($permissions & bindec('0100')) != 0;
$canExecute = ($permissions & bindec('0010')) != 0;
$isSpecial = ($permissions & bindec('0001')) != 0;
var_dump($canRead, $canWrite, $canExecute, $isSpecial);bool(true) bool(true) bool(false) bool(true)
При чтении данных, где числа передаются в виде двоичных строк.
$binaryPacket = '00011001';
$decimalValue = bindec($binaryPacket);
echo "Значение из пакета: $decimalValue";Значение из пакета: 25
Совместное использование с decbin для проверки целостности данных.
$original = 42;
$binary = decbin($original);
$restored = bindec($binary);
echo "Оригинал: $original, Двоичное: $binary, Восстановлено: $restored";Оригинал: 42, Двоичное: 101010, Восстановлено: 42
Перед использованием bindec рекомендуется проверить строку на допустимые символы.
function safe_bindec($str) {
if (!preg_match('/^[01]+$/', $str)) {
throw new InvalidArgumentException('Строка должна содержать только 0 и 1');
}
return bindec($str);
}
echo safe_bindec('11011'); // Корректно
try {
safe_bindec('11201');
} catch (Exception $e) {
echo $e->getMessage();
}27 Строка должна содержать только 0 и 1