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

Функция 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

Функции hexdec и dechex работают с шестнадцатеричной системой счисления. Аналогично, octdec и decoct предназначены для восьмеричной системы. Выбор функции зависит от исходного формата данных.

base_convert

Функция 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

Работа с битовыми флагами

Функция удобна для декодирования битовых масок, например, при анализе прав доступа.

Пример php
$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)
Преобразование данных из двоичных протоколов

При чтении данных, где числа передаются в виде двоичных строк.

Пример php
$binaryPacket = '00011001';
$decimalValue = bindec($binaryPacket);
echo "Значение из пакета: $decimalValue";
Значение из пакета: 25
Генерация и обратное преобразование

Совместное использование с decbin для проверки целостности данных.

Пример php
$original = 42;
$binary = decbin($original);
$restored = bindec($binary);
echo "Оригинал: $original, Двоичное: $binary, Восстановлено: $restored";
Оригинал: 42, Двоичное: 101010, Восстановлено: 42
Обработка пользовательского ввода с валидацией

Перед использованием bindec рекомендуется проверить строку на допустимые символы.

Пример php
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

PHP bindec function comments

En
Bindec Binary to decimal