В PHP
чем смысл существования функции binary-safe
?
Что делает их особенными и где они обычно используются?
Это означает, что функция будет работать правильно, когда вы передадите ей произвольные двоичные данные (т.е. строки, содержащие байты, отличные от ASCII, и / или нулевые байты).
Например, небезопасная функция может быть основана на функции C, которая ожидает строки с завершающим нулем, поэтому, если строка содержит нулевой символ, функция проигнорирует все, что находится после него.
Это актуально, потому что PHP не разделяет чисто строковые и двоичные данные.
Остальные пользователи уже упоминали, что
binary safe
означает в целом.В PHP значение более конкретное, ссылаясь только на то, что Майкл приводит в качестве примера.
Все строки в PHP имеют связанную длину, которая представляет собой количество байтов, составляющих их. Когда функция манипулирует строкой, она может:
0
.Также верно и то, что все строковые переменные PHP, которыми манипулирует движок, также завершаются нулем. Проблема с функциями, которые полагаются на 2., заключается в том, что, если сама строка содержит байт со значением
0
, функция, которая управляет ею, будет думать, что строка закончилась в этой точке, и проигнорирует все после этого.Например, если бы
strlen
функция PHP работала как стандартная библиотека Cstrlen
, результат здесь был бы неверным:источник
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 )Еще примеры:
\x
обозначает шестнадцатеричное представление. Смотрите: строки PHPТаблица ASCII для просмотра списка символов ASCII
источник
Hello\r\nWORLD
не должно быть таким же, какHello
если бы функция двоично-безопасная, верно?strlen()
двоичном коде ?