Как можно перевести текст в двоичный код?
Пробовал так, он переводит, но как то криво, в отличии от 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
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 бита информации. Вы преобразуете на самом деле разные исходные данные и потому получаете различный результат. Вот такое малое различие, которое может быть непонятно для языка с мягкой динамической типизацией, но крайне важное.
$x = "abc12345";
for ($i = 0; $i < strlen($x); $i++) {
echo decbin(ord($x[$i])) . "\n";
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Нужна помощь, как в этом коде сделать реализацию через ООП? Как сделать так чтобы класс получал данные из формы? Вот исходный код
Сейчас функция выводит мне весь список месяцов с годами типа: Январь 2016 ит
Подскажите пожалуйста книги или статьи по методике разработки классовЗадача:
Есть проект написанный на PHP на паттерне MVCВсё самописное