在PHP中,一个函数是二进制安全的意味着什么?
在PHP
中,一个函数是binary-safe
意味着什么?
是什么使他们特别,他们通常在哪里使用?
这意味着当你传递任意的二进制数据(即包含非ASCII字节和/或空字节的string)时,函数将正常工作。
例如,一个非二进制安全的函数可能基于一个C函数,该函数需要以空字符结尾的string,所以如果string包含空字符,函数会忽略它后面的任何内容。
这是相关的,因为PHP不会干净地分离string和二进制数据。
其他用户已经提到了一般的binary safe
手段。
在PHP中,含义更具体,仅指Michael所给的例子。
PHP中的所有string都有一个相关的长度,它们是组成它的字节数。 当一个函数操纵一个string时,它可以:
- 依靠这个长度的元数据。
- 依赖于以空字符结尾的string,即在数据实际上是string的一部分之后,会出现一个值为
0
的字节。
由引擎操纵的所有stringPHPvariables也是空的,也是事实。 依赖于2的函数的问题是,如果string本身包含一个值为0
的字节,那么操纵它的函数会认为string在那一点结束,并且在此之后将忽略所有的string。
例如,如果PHP的strlen
函数像C标准库strlen
一样工作,结果就是错误的:
$str = "abc\x00abc"; echo strlen($str); //gives 7, not 3!
更多例子:
<?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
表示hex符号。 请参阅: PHPstring
0x00 = NULL 0x04 = EOT (End of transmission)
ASCII表格来查看ASCII字符列表