Yanıtlar:
Bu, işlevin isteğe bağlı ikili verileri (yani ASCII olmayan bayt ve / veya boş bayt içeren dizeler) ilettiğinizde doğru çalışacağı anlamına gelir.
Örneğin, ikili olmayan güvenli bir işlev, boş sonlu dizeler bekleyen bir C işlevine dayanıyor olabilir, bu nedenle dizge bir boş karakter içeriyorsa, işlev ondan sonraki her şeyi göz ardı eder.
Bu önemlidir çünkü PHP dizge ve ikili verileri temiz bir şekilde ayırmaz.
Diğer kullanıcılar zaten binary safegenel olarak ne anlama geldiğinden bahsetti .
PHP'de anlam daha belirgindir, sadece Michael'ın örnek olarak verdiği şeye atıfta bulunur.
PHP'deki tüm dizelerin, onu oluşturan baytların sayısı olan ilişkili bir uzunluğu vardır. Bir işlev bir dizeyi işlediğinde, şunlardan biri yapabilir:
0görünecektir.Motor tarafından işlenen tüm dizge PHP değişkenlerinin de boş sonlandırıldığı doğrudur. 2'ye dayanan işlevlerle ilgili sorun, dizenin kendisi değerli bir bayt içeriyorsa 0, onu işleyen işlev dizenin o noktada bittiğini düşünecek ve bundan sonraki her şeyi yok sayacaktır.
Örneğin, PHP'nin strlenişlevi C standart kitaplığı gibi çalışıyorsa strlen, buradaki sonuç yanlış olur:
$str = "abc\x00abc";
echo strlen($str); //gives 7, not 3!
strlen()bir olan ikili güvenli işlev? Sizden onaylıyorum çünkü işlev için PHP Kılavuzu sayfasında ikili güvenli işlev mi yoksa ikili olmayan güvenli işlev strlen()mi olduğundan bahsedilmemiştir . PHP Kılavuzundaki bu tek eksik şey zihnimde kafa karışıklığı yaratıyor, bu yüzden bunu sizden onaylamak istiyorum. Cevabınızı merakla bekliyorum. Teşekkür ederim.
php -r 'var_dump("\x00\x00\x00");'doğrulamak için çalıştırın , ancak php'nin strlen'i çok uzun bir süredir ikili güvenlidir , çünkü en azından php 4.x (bununla birlikte, "mb_overload" adında bir iğrençlik vardır, ancak bunun yokmuş gibi davranalım - php.net /manual/en/mbstring.overload.php )
Daha fazla örnek:
<?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.
?>
\xonaltılı gösterimi belirtir. Bakınız: PHP dizeleri
0x00 = NULL
0x04 = EOT (End of transmission)
ASCII karakter listesini görmek için ASCII tablosu
Hello\r\nWORLDgibi aynı olmamalı Hello, değil mi?
strlen() ikili güvenli midir?