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

时间:2015-08-06 08:39:47

标签: 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

Ideone

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

1 个答案:

答案 0 :(得分:4)

您将$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