【发布时间】:2011-03-16 22:10:29
【问题描述】:
PHP 中的函数是 binary-safe 是什么意思?
是什么让它们特别,它们通常在哪里使用?
【问题讨论】:
标签: php
PHP 中的函数是 binary-safe 是什么意思?
是什么让它们特别,它们通常在哪里使用?
【问题讨论】:
标签: php
这意味着当您传递任意二进制数据(即包含非 ASCII 字节和/或空字节的字符串)时,该函数将正常工作。
例如,一个非二进制安全函数可能基于一个 C 函数,该函数需要以空字符结尾的字符串,因此如果字符串包含空字符,该函数将忽略它后面的任何内容。
这是相关的,因为 PHP 没有清晰地分离字符串和二进制数据。
【讨论】:
其他用户已经提到了binary safe 的一般含义。
在PHP中,含义更具体,仅指Michael给出的示例。
PHP 中的所有字符串都有一个相关的长度,即组成它的字节数。当一个函数操作一个字符串时,它可以:
0 的字节。引擎操作的所有字符串 PHP 变量也是空终止的,这也是事实。依赖于 2. 的函数的问题在于,如果字符串本身包含一个值为 0 的字节,则操作它的函数会认为该字符串已在该点结束并忽略之后的所有内容。
例如,如果 PHP 的 strlen 函数像 C 标准库 strlen 一样工作,那么这里的结果将是错误的:
$str = "abc\x00abc";
echo strlen($str); //gives 7, not 3!
【讨论】:
strlen() 是一个 binary-safe 函数吗?我向您确认,因为在函数 strlen() 的 PHP 手册 页面上没有提到它是 binary-safe 函数还是 non - 二进制安全 功能。 PHP 手册 中唯一缺少的东西在我脑海中造成了混乱,所以我想向您确认一下。我热切期待您的回复。谢谢。
php -r 'var_dump("\x00\x00\x00");' 进行验证,但是 php 的 strlen 在 非常 很长一段时间内都是二进制安全的,至少从 php 4.x 开始(也就是说,有一个名为“mb_overload”的可憎,但让我们只是假装不存在 - php.net/manual/en/mbstring.overload.php)
更多示例:
<?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 相同,对吧?
strlen()binary-safe吗?