Odpowiedzi:
Oznacza to, że funkcja będzie działać poprawnie, gdy przekażesz jej dowolne dane binarne (tj. Łańcuchy zawierające bajty inne niż ASCII i / lub bajty zerowe).
Na przykład funkcja niebinarnie bezpieczna może opierać się na funkcji C, która oczekuje ciągów zakończonych znakiem null, więc jeśli ciąg zawiera znak null, funkcja zignoruje wszystko po nim.
Jest to istotne, ponieważ PHP nie oddziela czysto ciągów i danych binarnych.
Inni użytkownicy już wspomnieli, co binary safe
to ogólnie znaczy.
W PHP znaczenie jest bardziej szczegółowe, odwołując się tylko do tego, co Michael podaje jako przykład.
Wszystkie łańcuchy w PHP mają skojarzoną długość, która jest liczbą bajtów, które go tworzą. Gdy funkcja manipuluje łańcuchem, może:
0
.Prawdą jest również, że wszystkie ciągowe zmienne PHP, którymi manipuluje silnik, są również zakończone znakiem null. Problem z funkcjami, które opierają się na 2. polega na tym, że jeśli sam łańcuch zawiera bajt z wartością 0
, funkcja, która nim manipuluje, pomyśli, że łańcuch zakończył się w tym momencie i zignoruje wszystko później.
Na przykład, jeśli strlen
funkcja PHP działałaby jak standardowa biblioteka C strlen
, wynik byłby tutaj nieprawidłowy:
$str = "abc\x00abc";
echo strlen($str); //gives 7, not 3!
strlen()
jest funkcją bezpieczną dla plików binarnych ? Potwierdzam od Ciebie, ponieważ na stronie podręcznika PHP dla funkcji strlen()
nie wspomniano, czy jest to funkcja bezpieczna binarnie, czy niebinarna funkcja bezpieczna . Ta jedyna brakująca rzecz w podręczniku PHP powoduje zamieszanie w moim umyśle, więc chcę to potwierdzić od Ciebie. Z niecierpliwością czekam na Twoją odpowiedź. Dziękuję Ci.
php -r 'var_dump("\x00\x00\x00");'
aby sprawdzić, ale strlen php był binarny bezpieczny od bardzo dawna, od co najmniej php 4.x (to powiedziawszy, istnieje obrzydliwość o nazwie "mb_overload", ale udawajmy, że nie istnieje - php.net /manual/en/mbstring.overload.php )
Więcej przykładów:
<?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
oznacza notację szesnastkową. Zobacz: ciągi PHP
0x00 = NULL
0x04 = EOT (End of transmission)
Tabela ASCII, aby wyświetlić listę znaków ASCII
Hello\r\nWORLD
nie powinno być takie samo, jak Hello
gdyby funkcja była bezpieczna binarnie, prawda?
strlen()
binarnie bezpieczna ?