为什么PHP substr()会更改ASCII回车字节?
我打算使用一个长字符串来处理大量位标志,将结果字符串保留在Redis中。然而,偶然发现了一个php错误(?)。包含使用为什么PHP substr()会更改ASCII回车字节?,php,binary-data,substr,Php,Binary Data,Substr,我打算使用一个长字符串来处理大量位标志,将结果字符串保留在Redis中。然而,偶然发现了一个php错误(?)。包含使用substr()读取的位00001101的字节返回意外值: $bin = 0b00001101; // 13 - ASCII Carriage return $c = substr($bin, 0, 1); // read this character printf("Expectation: 00001101, reality: %08b\n", $c); // 000
substr()读取的位00001101
的字节返回意外值:
$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
设置为整数
对$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
谢谢可能是我制造了一个坏例子/隔离了这个问题。最初我有一个较长的二进制字符串,从中读取一个特定的字节。我会重写这个例子。没错,现在我明白了。再次感谢!