在PHP中,函数是二进制安全的是什么意思?

时间:2010-07-16 11:52:16

标签: php

PHP中, binary-safe 的功能是什么意思?

是什么让它们与众不同?它们通常在哪里使用?

3 个答案:

答案 0 :(得分:96)

这意味着当您传递任意二进制数据(即包含非ASCII字节和/或空字节的字符串)时,该函数将正常工作。

例如,非二进制安全函数可能基于C函数,该函数需要以null结尾的字符串,因此如果字符串包含空字符,则该函数将忽略其后的任何内容。

这是相关的,因为PHP没有干净地分隔字符串和二进制数据。

答案 1 :(得分:84)

其他用户已经提到了binary safe的含义。

在PHP中,含义更具体,仅指Michael给出的例子。

PHP中的所有字符串都有一个相关的长度,它是组成它的字节数。当函数操作字符串时,它可以:

  1. 依靠这个长度的元数据。
  2. 依赖于以空值终止的字符串,即在实际上是字符串一部分的数据之后,将出现值为0的字节。
  3. 引擎操作的所有字符串PHP变量也都是以null结尾的。依赖于2.的函数的问题在于,如果字符串本身包含值为0的字节,则操作它的函数将认为该字符串已在该点结束并且将忽略之后的所有内容。 / p>

    例如,如果PHP的strlen函数像C标准库strlen一样工作,那么结果就是错误的:

    $str = "abc\x00abc";
    echo strlen($str); //gives 7, not 3!
    

答案 2 :(得分:55)

更多示例:

<?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 strings

0x00 = NULL
0x04 = EOT (End of transmission)

ASCII table查看ASCII字符列表