2010-07-16 78 views

回答

82

这意味着当传递给它(包含非ASCII字节和/或空字节即字符串)任意的二进制数据的功能将正常工作。

例如,非二进制安全功能可能基于一个C函数,预计空值终止字符串,因此如果字符串包含一个空字符,该函数将忽略之后任何事情。

这是相关的,因为PHP不会干净地分离字符串和二进制数据。

+0

这是否意味着二进制字符串安全只包含长度为1个字节的“角色”? – 2014-07-09 03:25:36

+2

@CharlieParker:不,你明白了。二进制安全性是* functions *的一个属性,这意味着它们可以正确处理任意*字符串。反过来是一个只包含ASCII字符*和*无空字符的字符串 - 这样的字符串应该被任何函数正确处理。 – 2014-07-09 06:36:01

+0

也许我很困惑,因为我正在阅读redis协议中的“批量字符串”,并表示它们代表了“单个二进制安全字符串”。我想我现在正确理解你的帖子。然而,说一个字符串是“二进制安全的”(如我提供的例子)是否有意义? – 2014-07-09 16:05:59

69

其他用户已经提到一般是指什么binary safe

在PHP中,其含义更具体,仅指迈克尔给出的例子。

在PHP所有串具有相关联的长度,其是构成它的字节数。当一个函数处理一个字符串时,它可以:

  1. 依靠那个长度的元数据。
  2. 依靠字符为空终止,即,实际上是字符串的部分中的数据之后,随着值0一个字节将出现。

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

举例来说,如果PHP的strlen功能的工作就像C标准库strlen,这里的结果将是错误的:

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

最后一个例子! – Raffaele 2012-08-27 18:19:33

+0

好解释 – 2013-12-14 10:21:44

+1

在我的PHP 7.0测试中,strlen()函数是一个二进制安全函数。 – linjie 2016-10-28 02:24:52

43

更多的例子:

<?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字符列表

+4

最好解释。 – 2013-12-14 10:23:08

+0

为了确保我能理解,如果函数是二进制安全的,那么'Hello \ r \ nWORLD'不应该与'Hello'相同,对吧? – 2014-07-09 02:28:11

+0

另外,这个功能是如何实现的?有没有一个正则表达式来检查它的二进制安全还是使用了不同的方法? – 2014-07-09 03:06:57