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

Ser*_*rge 6 php binary-data substr

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

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

Ideone

substr()二元安全的假设是错误的吗?还试过mb_substr(),将编码设置为8bit完全相同的结果.

Mar*_*ker 4

您设置$bin整数 13

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

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

使用printf()with %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
Run Code Online (Sandbox Code Playgroud)