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

Zac*_*112 112 php

PHP什么它通过一个函数是指binary-safe

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

Mic*_*rdt 98

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

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

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

  • @CharlieParker:不,你倒退了.二进制安全性是*functions*的一个属性,这意味着它们正确处理*any*字符串.反过来是一个只包含ASCII字符*和*没有空字符的字符串 - 这样的字符串应该由任何函数正确处理. (3认同)
  • 这是否意味着二进制安全字符串只包含长度为1个字节的"字符"? (2认同)

Art*_*cto 90

其他用户已经提到了binary safe一般的含义.

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

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

  1. 依靠那个长度的元数据.
  2. 依赖于以空值终止的字符串,即在实际上是字符串一部分的数据之后,0将出现一个带有值的字节.

由引擎操纵的所有字符串PHP变量也是以空值终止的.依赖于2.的函数的问题在于,如果字符串本身包含带有值的字节0,则操作它的函数将认为字符串已在该点结束并且在此之后将忽略所有内容.

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

$str = "abc\x00abc";
echo strlen($str); //gives 7, not 3!
Run Code Online (Sandbox Code Playgroud)

  • 最后一个例子! (13认同)
  • 在我的PHP 7.0测试中,strlen()函数是一个二进制安全函数. (4认同)

小智 59

更多例子:

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

?>
Run Code Online (Sandbox Code Playgroud)

\x表示十六进制表示法.请参阅:PHP字符串

0x00 = NULL
0x04 = EOT (End of transmission)
Run Code Online (Sandbox Code Playgroud)

ASCII表查看ASCII字符列表