Ответы:
Это означает, что функция будет работать правильно, когда вы передадите ей произвольные двоичные данные (т.е. строки, содержащие байты, отличные от ASCII, и / или нулевые байты).
Например, небезопасная функция может быть основана на функции C, которая ожидает строки с завершающим нулем, поэтому, если строка содержит нулевой символ, функция проигнорирует все, что находится после него.
Это актуально, потому что PHP не разделяет чисто строковые и двоичные данные.
Остальные пользователи уже упоминали, что binary safe
означает в целом.
В PHP значение более конкретное, ссылаясь только на то, что Майкл приводит в качестве примера.
Все строки в PHP имеют связанную длину, которая представляет собой количество байтов, составляющих их. Когда функция манипулирует строкой, она может:
0
.Также верно и то, что все строковые переменные PHP, которыми манипулирует движок, также завершаются нулем. Проблема с функциями, которые полагаются на 2., заключается в том, что, если сама строка содержит байт со значением 0
, функция, которая управляет ею, будет думать, что строка закончилась в этой точке, и проигнорирует все после этого.
Например, если бы strlen
функция PHP работала как стандартная библиотека C strlen
, результат здесь был бы неверным:
$str = "abc\x00abc";
echo strlen($str); //gives 7, not 3!
strlen()
является бинарно-безопасной функцией? Я подтверждаю это, потому что на странице руководства PHP для функции strlen()
не упоминается, является ли это безопасной для двоичного кода функцией или небинарной безопасной функцией. Это единственное, чего не хватает в Руководстве по 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
0x00 = NULL
0x04 = EOT (End of transmission)
Таблица ASCII для просмотра списка символов ASCII
Hello\r\nWORLD
не должно быть таким же, как Hello
если бы функция двоично-безопасная, верно?
strlen()
двоичном коде ?