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)
substr()二元安全的假设是错误的吗?还试过mb_substr(),将编码设置为8bit完全相同的结果.
您设置$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)