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

PHP中,函数是 binary-safe是什么意思?

它们的特殊之处是什么? 它们通常在哪里使用?

22361 次浏览

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

例如,一个非二进制安全的函数可能基于一个 C 函数,该函数期望以空结尾的字符串,所以如果字符串包含空字符,该函数将忽略它之后的任何内容。

这是相关的,因为 PHP 没有清楚地将字符串和二进制数据分开。

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

在 PHP 中,这个词的意思更加具体,只是指 Michael 给出的例子。

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

  1. 依赖于那个长度的元数据。
  2. 依赖于以 null 结尾的字符串,也就是说,在实际上是字符串的一部分的数据之后,将出现一个值为 0的字节。

引擎操作的所有字符串 PHP 变量也都以 null 结尾,这也是事实。依赖于2的函数的问题。即,如果字符串本身包含一个值为 0的字节,操作它的函数将认为字符串已经在该点结束,并将忽略此后的所有内容。

例如,如果 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表示十六进制表示法。参见: PHP 字符串

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

ASCII 表 查看 ASCII 字符列表