2010-07-16 49 views

回答

82

這意味着當傳遞給它(包含非ASCII字節和/或空字節即字符串)任意的二進制數據的功能將正常工作。

例如,非二進制安全功能可能基於一個C函數,預計空值終止字符串,因此如果字符串包含一個空字符,該函數將忽略之後任何事情。

這是相關的,因爲PHP不會乾淨地分離字符串和二進制數據。

+0

這是否意味着二進制字符串安全只包含長度爲1個字節的「角色」? – 2014-07-09 03:25:36

+2

@CharlieParker:不,你明白了。二進制安全性是* functions *的一個屬性,這意味着它們可以正確處理任意*字符串。反過來是一個只包含ASCII字符*和*無空字符的字符串 - 這樣的字符串應該被任何函數正確處理。 – 2014-07-09 06:36:01

+0

也許我很困惑,因爲我正在閱讀redis協議中的「批量字符串」,並表示它們代表了「單個二進制安全字符串」。我想我現在正確理解你的帖子。然而,說一個字符串是「二進制安全的」(如我提供的例子)是否有意義? – 2014-07-09 16:05:59

69

其他用戶已經提到一般是指什麼binary safe

在PHP中,其含義更具體,僅指邁克爾給出的例子。

在PHP所有串具有相關聯的長度,其是構成它的字節數。當一個函數處理一個字符串時,它可以:

  1. 依靠那個長度的元數據。
  2. 依靠字符爲空終止,即,實際上是字符串的部分中的數據之後,隨着值0一個字節將出現。

也是事實,由引擎操縱的所有字符串PHP變量也是空終止的。依賴於2的函數的問題是,如果字符串本身包含一個值爲0的字節,則操作它的函數會認爲該字符串在該點處結束,並且在此之後將忽略所有內容。

舉例來說,如果PHP的strlen功能的工作就像C標準庫strlen,這裏的結果將是錯誤的:

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

最後一個例子! – Raffaele 2012-08-27 18:19:33

+0

好解釋 – 2013-12-14 10:21:44

+1

在我的PHP 7.0測試中,strlen()函數是一個二進制安全函數。 – linjie 2016-10-28 02:24:52

43

更多的例子:

<?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 strings

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

ASCII table看到的ASCII字符列表

+4

最好解釋。 – 2013-12-14 10:23:08

+0

爲了確保我能理解,如果函數是二進制安全的,那麼'Hello \ r \ nWORLD'不應該與'Hello'相同,對吧? – 2014-07-09 02:28:11

+0

另外,這個功能是如何實現的?有沒有一個正則表達式來檢查它的二進制安全還是使用了不同的方法? – 2014-07-09 03:06:57