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


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

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

3 101
php

3 ответа:

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

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

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

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

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

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

  1. рассчитывать на то, что длина мета-данных.
  2. полагаться на строку с нулевым завершением, т. е., что после данных, которые на самом деле часть строки, байт со значением 0 появится.

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

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

$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