Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Перевод текста в двоичный код PHP

#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"; }

Комментариев нет:

Отправить комментарий