#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"; }
Комментариев нет:
Отправить комментарий