为什么 PHP substr() 改变 ASCII 回车 return 字节?

Why does PHP substr() change ASCII carriage return byte?

我打算用一个长字符串来操作大量的位标志,将结果字符串保存在Redis中。但是,偶然发现了一个 php 错误 (?)。包含位 00001101 的字节使用 substr() returns 意外值读取:

$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,结果完全相同。

您正在将 $bin 设置为 整数 13

$bin 使用 substr()$bin 转换为 字符串 ("13")

您正在读取该字符串的第一个字符 ("1")

printf()%b 一起使用,您明确将该字符串转换回整数 1

the argument is treated as an integer, and presented as a binary number.

编辑

这段代码应该会给出您期望的结果

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