【问题标题】:In PHP what does it mean by a function being binary-safe?在 PHP 中,二进制安全的函数是什么意思?
【发布时间】:2011-03-16 22:10:29
【问题描述】:

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

是什么让它们特别,它们通常在哪里使用?

【问题讨论】:

    标签: php


    【解决方案1】:

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

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

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

    【讨论】:

    • 这是否意味着二进制安全字符串只包含长度为 1 字节的“字符”?
    • @CharlieParker:不,你说反了。二进制安全是 functions 的一个属性,这意味着它们可以正确处理 any 字符串。反之则为仅包含 ASCII 字符 不包含空字符的字符串 - 任何函数都应正确处理此类字符串。
    • 也许我很困惑,因为我正在阅读“批量字符串”的 redis 协议,它说它们代表“单一二进制二进制安全”字符串。我想我现在正确理解了你的帖子。但是,说字符串是“二进制安全的”(如我提供的示例中所示)是否有意义?
    【解决方案2】:

    其他用户已经提到了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!
    

    【讨论】:

    • 在我的 PHP 7.0 测试中,strlen() 函数是一个二进制安全函数。
    • @Artefacto : 你是说 PHP 内置函数 strlen() 是一个 binary-safe 函数吗?我向您确认,因为在函数 strlen()PHP 手册 页面上没有提到它是 binary-safe 函数还是 non - 二进制安全 功能。 PHP 手册 中唯一缺少的东西在我脑海中造成了混乱,所以我想向您确认一下。我热切期待您的回复。谢谢。
    • @PHPLover 是的 strlen() 是二进制安全的。运行php -r 'var_dump("\x00\x00\x00");' 进行验证,但是 php 的 strlen 在 非常 很长一段时间内都是二进制安全的,至少从 php 4.x 开始(也就是说,有一个名为“mb_overload”的可憎,但让我们只是假装不存在 - php.net/manual/en/mbstring.overload.php)
    【解决方案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 strings

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

    ASCII table查看ASCII字符列表

    【讨论】:

    • 只是为了确保我理解,如果函数是二进制安全的,那么Hello\r\nWORLD 不应该与Hello 相同,对吧?
    • 还有,这样的功能是怎么实现的呢?是否有正则表达式来检查其二进制安全还是使用不同的方法?
    • @Subscriberius : 是内置函数strlen()binary-safe吗?
    猜你喜欢
    • 1970-01-01
    • 2016-08-24
    • 2012-12-10
    • 1970-01-01
    • 2011-08-22
    • 2015-06-02
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多