двоичные данные — почему PHP substr () меняет байт возврата каретки ASCII?

Я собирался использовать длинную строку для манипулирования большим количеством битовых флагов, сохраняя полученную строку в Redis. Однако наткнулся на ошибку php (?). Байт, содержащий биты 00001101 читать используя substr() возвращает неожиданное значение:

$bin = 0b00001101;  // 13 - ASCII Carriage return
$c = substr($bin, 0, 1);    // read this character
printf("Expectation: 00001101, reality: %08b\n", $c); // 00000001

Ideone

Есть предположение, что substr() бинарно-безопасный не так? Также попробовал mb_substr(), установив кодировку на 8bit с точно таким же результатом.

6

Решение

Вы устанавливаете $bin для целое число 13

С помощью substr() против $bin кастинг $bin к строка ("13")

Вы читаете первый символ этой строки ("1")

С помощью printf() с %bвы явно приводите эту строку обратно к целому числу 1

аргумент обрабатывается как целое число и представляется как двоичное число.

РЕДАКТИРОВАТЬ

Этот код должен дать ожидаемый результат

$bin = 0b00001101;  // 13 - ASCII Carriage return
$c = substr(chr($bin), 0, 1);    // read this character
printf("Expectation: 00001101, reality: %08b\n", ord($c)); // 00001101
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]