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

6

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

$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个回答

4
您正在将$bin设置为一个整数13
$bin使用substr()会将$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

谢谢!可能我创建了一个糟糕的示例/问题隔离。最初,我有一个更长的二进制字符串,从中读取特定字节。将重写示例。 - Serge
没错,现在我明白了。再次感谢! - Serge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接