我打算使用一个长字符串来操作大量的位标志,将结果字符串保存在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
假设substr()
是二进制安全的错误吗?还尝试mb_substr()
,将编码设置为8bit
,结果完全相同。
答案 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