为什么 PHP substr() 改变 ASCII 回车 return 字节?
Why does PHP substr() change ASCII carriage return byte?
我打算用一个长字符串来操作大量的位标志,将结果字符串保存在Redis中。但是,偶然发现了一个 php 错误 (?)。包含位 00001101
的字节使用 substr()
returns 意外值读取:
$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
设置为 整数 13
对 $bin
使用 substr()
将 $bin
转换为 字符串 ("13"
)
您正在读取该字符串的第一个字符 ("1"
)
将 printf()
与 %b
一起使用,您明确将该字符串转换回整数 1
the argument is treated as an integer, and presented as a binary number.
编辑
这段代码应该会给出您期望的结果
$bin = 0b00001101; // 13 - ASCII Carriage return
$c = substr(chr($bin), 0, 1); // read this character
printf("Expectation: 00001101, reality: %08b\n", ord($c)); // 00001101
我打算用一个长字符串来操作大量的位标志,将结果字符串保存在Redis中。但是,偶然发现了一个 php 错误 (?)。包含位 00001101
的字节使用 substr()
returns 意外值读取:
$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
设置为 整数 13
对 $bin
使用 substr()
将 $bin
转换为 字符串 ("13"
)
您正在读取该字符串的第一个字符 ("1"
)
将 printf()
与 %b
一起使用,您明确将该字符串转换回整数 1
the argument is treated as an integer, and presented as a binary number.
编辑
这段代码应该会给出您期望的结果
$bin = 0b00001101; // 13 - ASCII Carriage return
$c = substr(chr($bin), 0, 1); // read this character
printf("Expectation: 00001101, reality: %08b\n", ord($c)); // 00001101