Я собирался использовать длинную строку для манипулирования большим количеством битовых флагов, сохраняя полученную строку в 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
Есть предположение, что substr()
бинарно-безопасный не так? Также попробовал mb_substr()
, установив кодировку на 8bit
с точно таким же результатом.
Вы устанавливаете $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
Других решений пока нет …