php的內部函數在操作二進制數據時能保證達到預期的結果,例如 str_replace、stristr、strcmp 等函數,我們就說這些函數是二進制安全的。
下面通過 c 語言 和 php 的對比 來看 他們對二進制數據的處理#include "stdio.h"#include "string.h"int main(){char a[] = "aa/0b";char b[] = "aa/0c";printf("%d/n", strcmp(a, b));printf("%ld/n", strlen(a));}/* 0 2 */可以看出來 c語言 "/0" 是字符串結束,所以認為 "aa/0b' 和 "aa/0c" 是一樣的,長度為2 拋棄了 "/0b" 和 "/0c" .
<?php/** * Created by PhpStorm. * User: leon * Date: 17/11/6 * Time: 上午10:24 */ $a = "aa/0b"; $b = "aa/0c"; $c = "/0/0"; $d = 'a'; $e = 'a'; var_dump(strcmp($a, $b)); var_dump(strcmp($c, $d)); var_dump(strlen($a)); var_dump(strlen($c));# res : int(-1) int(0) int(4) int(2)php "aa/0b" 和 "aa/0c" 是不同的 ,并且長度為42. php實現二進制安全的原理
PHP中字符串通過 zend_string 表示:
PHP中 變量 zend_html' target='_blank'>value 表示:
gc: 變量引用信息,比如當前value的引用數,所有用到引用計數的變量類型都會有這個結構,3.1節會詳細分析
h: 哈希值,數組中計算索引時會用到
len: 字符串長度,通過這個值保證二進制安全
val: 字符串內容,變長struct,分配時按len長度申請內存
len: 字符串長度,通過這個值保證二進制安全 ,它不需要像C 一樣用喲 ‘/0’ 結尾符來判斷字符串的結束,而是通過len
C : 以 ’/0’ 為結束符,所以c的字符串不能包含文本,圖片、音頻、視頻、壓縮文件這樣的二進制數據。
Php : 記錄 len
SDS : simple dynamic string 簡單動態字符串的抽象類型,應用到字符表示:
SDS 數據結構:
struct sdshdr { # 記錄 buf 數組中已使用字節的數量 # 等于 SDS 所保存字符串的長度 int len; # 記錄 buf 數組中未使用字節的數量 int free; # 字節數組,用于保存字符串 char buf[];};
redis 的結構定義中也記錄了SDS所保存字符串的長度,通過這個值保證二進制安全,SDS 的 API 都會用 字符串的len 屬性來判斷字符串是否結束。
相關推薦:
php二進制安全的含義
php的二進制安全_PHP教程
PHP函數二進制安全有關問題
以上就是Php關于二進制安全詳解的詳細內容,更多請關注 其它相關文章!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答