在看php手冊的時候,經常看到一句話」該函式是二進位制安全的」。
先看一段**:
<?php
$string1 = "hello";
$string2 = "hello\0hello";
echo strcoll($string1, $string2); /*返回0, 由於是非二進位制安全,誤判為相等 */
echo strcmp($string1, $string2); /*返回<0,不相等*/
?>
這是為什麼呢?php是基於c實現的,php**都會被zend引擎編譯成opcode,最終作為c語言去執行。 而對於c語言『\0』是字串的結束符,它讀到』\0』就會預設字元讀取已經結束,從而拋掉後面的字串。
main()
有乙個二進位制安全的定義,我挺喜歡的:
程式不會對其中的資料做任何限制、過濾、或者假設 —— 資料在寫入時是什麼樣的, 它被讀取時就是什麼樣。那麼,既然php是基於c實現的,c 字串型別不是二進位制安全的,php又是如何實現的呢?這就是資料結構的功勞了。 php的核心中,是如此定義字串型別的
struct str;
val是指向字串記憶體的指標,len表示該字串的長度,無論是否遇到「\0」字元,c都按照len長度讀取該字串。
**:
二進位制安全
二進位制安全 舉個例子,如果有一種使用空字元來分割多個單詞的特殊資料格式,如圖2 17所示,那麼這種格式就不能使用c字串來儲存,因為c字串所用的函式只會識別出其中的 redis 而忽略之後的 cluster 雖然資料庫一般用於儲存文字資料,但使用資料庫來儲存二進位制資料的場景也不少見,因此,為了確保...
二進位制安全
1 二進位制安全 二進位制安全是指,在傳輸資料時,保證二進位制資料的資訊保安,也就是不被篡改 破譯等,如果被攻擊,能夠及時檢測出來。二進位制安全包含了密碼學的一些東西,比如加解密 簽名等。舉個例子,你把資料11110000加密成10001000,然後傳給我,就是一種二進位制安全的做法。php中二進位...
C 有趣的二進位制
小新在學c語言的時候,鄺老師告訴他double型別的資料在表示小數的時候,小數點後的有效位是有限的,但是沒有告訴他這是為什麼,後來他發現0.1的二進位制是乙個無限迴圈小數0.000110011001100110011001100 如果只取27位小數,再轉換成十進位制的話就變成了0.099999994...