Answers:
这意味着当您传递任意二进制数据(即,包含非ASCII字节和/或空字节的字符串)时,该函数将正常运行。
例如,非二进制安全函数可能基于C函数,该函数需要以null结尾的字符串,因此,如果字符串包含null字符,该函数将忽略其后的所有内容。
这是相关的,因为PHP不会干净地分隔字符串和二进制数据。
其他用户已经提到了binary safe
一般意义。
在PHP中,含义更具体,仅以Michael给出的示例为例。
PHP中的所有字符串都有关联的长度,该长度是组成字符串的字节数。当函数操作字符串时,它可以:
0
将出现。确实,引擎操作的所有字符串PHP变量也都是以空值结尾的。依赖2的函数的问题是,如果字符串本身包含带有值的字节0
,则正在操作该函数的函数将认为该字符串已在该点结束,并且之后将忽略所有内容。
例如,如果PHP的strlen
功能像C标准库那样工作strlen
,则结果将是错误的:
$str = "abc\x00abc";
echo strlen($str); //gives 7, not 3!
strlen()
是二进制安全函数吗?我向您确认是因为在该函数的PHP手册页面strlen()
上没有提到它是二进制安全函数还是非二进制安全函数。PHP手册中唯一缺少的一件事就是在我脑海中造成混乱,因此我想向您确认。我热切期待您的答复。谢谢。
php -r 'var_dump("\x00\x00\x00");'
以进行验证,但是php的strlen在很长一段时间内都是二进制安全的,因为至少是php 4.x(也就是说,存在一个可憎之类叫做“ mb_overload”,但请假装不存在-php.net /manual/en/mbstring.overload.php)
更多示例:
<?php
$string1 = "Hello";
$string2 = "Hello\x00World";
// This function is NOT ! binary safe
echo strcoll($string1, $string2); // gives 0, strings are equal.
// This function is binary safe
echo strcmp($string1, $string2); // gives <0, $string1 is less than $string2.
?>
\x
表示十六进制表示法。另请:PHP字符串
0x00 = NULL
0x04 = EOT (End of transmission)
ASCII表以查看ASCII字符列表
Hello\r\nWORLD
应该不像Hello
函数是二进制安全的一样,对吗?
strlen()
二进制安全的吗?