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

175
06 апреля 2019, 02:20

Как можно перевести текст в двоичный код?

Пробовал так, он переводит, но как то криво, в отличии от decbin:

$x = "abc12345";
$x = base_convert($x, 16, 2);
echo $x;

И если decbin работает как надо, почему base_convert работает непонятно как? на официальной странице есть пример показывающий работу

Пример #1 Пример использования base_convert()

<?php
$hexadecimal = 'a37334';
echo base_convert($hexadecimal, 16, 2);
?>

Результат выполнения данного примера:

101000110111001100110100

Сравнил две функции:

<?
$x = "abc12345";
for ($i = 0; $i < strlen($x); $i++) {
    echo decbin(ord($x[$i])) . "";
}
echo "<br>";
$y = "abc12345";
$y = base_convert($y, 16, 2);
echo $y;
?>

Результат выполнения:

110000111000101100011110001110010110011110100110101
10101011110000010010001101000101

От чего такая разница?

base_convert — Преобразовывает числа между произвольными системами счисления

decbin — Переводит число из десятичной системы счисления в двоичную

ord - Возвращает ASCII код символа

Самое интересно в том что если сделать так

<?
$x = "abc12345";
for ($i = 0; $i < strlen($x); $i++) {
    echo decbin(ord($x[$i]));
}
$y = "abc12345";
for ($i = 0; $i < strlen($y); $i++) {
    echo base_convert(ord($y[$i]), 10, 2);
}
?>

Результат будет одинаковым:

110000111000101100011110001110010110011110100110101
110000111000101100011110001110010110011110100110101
Answer 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 бита информации. Вы преобразуете на самом деле разные исходные данные и потому получаете различный результат. Вот такое малое различие, которое может быть непонятно для языка с мягкой динамической типизацией, но крайне важное.

Answer 2
$x = "abc12345";
for ($i = 0; $i < strlen($x); $i++) {
    echo decbin(ord($x[$i])) . "\n";
}
READ ALSO
Как получить данные из формы в ООП php?

Как получить данные из формы в ООП php?

Нужна помощь, как в этом коде сделать реализацию через ООП? Как сделать так чтобы класс получал данные из формы? Вот исходный код

152
Как разбить вывод wp_get_archives ($args) по годам?

Как разбить вывод wp_get_archives ($args) по годам?

Сейчас функция выводит мне весь список месяцов с годами типа: Январь 2016 ит

142
Методика разработки классов PHP

Методика разработки классов PHP

Подскажите пожалуйста книги или статьи по методике разработки классовЗадача:

142
Как лучше реализовать режим разработки?

Как лучше реализовать режим разработки?

Есть проект написанный на PHP на паттерне MVCВсё самописное

146