#php #php7 #системы_счисления
Как можно перевести текст в двоичный код?
Пробовал так, он переводит, но как то криво, в отличии от decbin:
$x = "abc12345";
$x = base_convert($x, 16, 2);
echo $x;
И если decbin работает как надо, почему base_convert работает непонятно как?
на официальной странице есть пример показывающий работу
Пример #1 Пример использования base_convert()
Результат выполнения данного примера:
101000110111001100110100
Сравнил две функции:
";
$y = "abc12345";
$y = base_convert($y, 16, 2);
echo $y;
?>
Результат выполнения:
110000111000101100011110001110010110011110100110101
10101011110000010010001101000101
От чего такая разница?
base_convert — Преобразовывает числа между произвольными системами счисления
decbin — Переводит число из десятичной системы счисления в двоичную
ord - Возвращает ASCII код символа
Самое интересно в том что если сделать так
Результат будет одинаковым:
110000111000101100011110001110010110011110100110101
110000111000101100011110001110010110011110100110101
Ответы
Ответ 1
base_convert — Преобразовывает числа между произвольными системами счисления abc12345 - это корректное шестнадцатеричное число из 4 байт, эквивалент 2881561413 в десятичной системе счисления. В то же время циклом с вызовом ord по строке вы обрабатываете значение не как число, а как массив строковых байт. Так, символ a - это байт \x61 (но только для ASCII-совместимых кодировок! Может быть иначе). Затем вы некорректно собираете результирующую строку, теряя ведущие нули результата. И потому получаете последовательность из некорректных 51 бит вместо 64: for ($i = 0; $i < strlen($x); $i++) { echo str_pad(decbin(ord($x[$i])), 8, '0', STR_PAD_LEFT); } 0110000101100010011000110011000100110010001100110011010000110101 Почему 64 бита? Потому что в ASCII строке abc12345 всего 8 байт, каждый символ закодирован значением в 8 бит. Но в 16-ричном числе abc12345 только 4 байта, потому что одна 16-ричная цифра кодирует 4 бита информации. Вы преобразуете на самом деле разные исходные данные и потому получаете различный результат. Вот такое малое различие, которое может быть непонятно для языка с мягкой динамической типизацией, но крайне важное.Ответ 2
$x = "abc12345"; for ($i = 0; $i < strlen($x); $i++) { echo decbin(ord($x[$i])) . "\n"; }
Комментариев нет:
Отправить комментарий