В PHP, что это означает, что функция является бинарной безопасностью?

В PHP что это означает, что функция является binary-safe ?

Что делает их особенными и где они обычно используются?

Это означает, что функция будет работать правильно, когда вы передадите произвольные двоичные данные (т.е. строки, содержащие байты не ASCII и / или нулевые байты).

Например, функция, отличная от двоичного кода, может быть основана на функции C, которая ожидает строки с нулевым завершением, поэтому, если строка содержит нулевой символ, функция будет игнорировать что-либо после нее.

Это актуально, потому что PHP не выполняет чистое разделение строковых и двоичных данных.

Другие пользователи уже упомянули, что такое binary safe в целом.

В PHP значение более конкретно, ссылаясь только на то, что дает Майкл в качестве примера.

Все строки в PHP связаны с длиной, которая представляет собой количество байтов, которые ее составляют. Когда функция управляет строкой, она может:

  1. Положитесь на метаданные этой длины.
  2. Положитесь на строку с нулевым завершением, т. Е. Что после данных, которые фактически являются частью строки, появится байт со значением 0 .

Также верно, что все строковые переменные PHP, управляемые движком, также заканчиваются нулем. Проблема с функциями, которые полагаются на 2., заключается в том, что если сама строка содержит байт со значением 0 , функция, которая манипулирует им, будет думать, что строка закончилась в этой точке и после этого будет игнорировать все.

Например, если функция strlen PHP работала как стандартная библиотека strlen c, результат здесь был бы неправильным:

 $str = "abc\x00abc"; echo strlen($str); //gives 7, not 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

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

Таблица ASCII для просмотра списка символов ASCII