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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

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

$str = "abc\x00abc";
echo strlen($str); //gives 7, not 3!

Ответ 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 char

Ответ 4

Это означает, что функция может работать и давать желаемые результаты даже с двоичными данными в качестве части своих аргументов.