php的內(nèi)部函數(shù)在操作二進(jìn)制數(shù)據(jù)時(shí)能保證達(dá)到預(yù)期的結(jié)果,例如 str_replace、stristr、strcmp 等函數(shù),我們就說這些函數(shù)是二進(jìn)制安全的。
下面通過 c 語言 和 php 的對(duì)比 來看 他們對(duì)二進(jìn)制數(shù)據(jù)的處理#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" 是字符串結(jié)束,所以認(rèn)為 "aa/0b' 和 "aa/0c" 是一樣的,長(zhǎng)度為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" 是不同的 ,并且長(zhǎng)度為42. php實(shí)現(xiàn)二進(jìn)制安全的原理
PHP中字符串通過 zend_string 表示:
PHP中 變量 zend_html' target='_blank'>value 表示:
gc: 變量引用信息,比如當(dāng)前value的引用數(shù),所有用到引用計(jì)數(shù)的變量類型都會(huì)有這個(gè)結(jié)構(gòu),3.1節(jié)會(huì)詳細(xì)分析
h: 哈希值,數(shù)組中計(jì)算索引時(shí)會(huì)用到
len: 字符串長(zhǎng)度,通過這個(gè)值保證二進(jìn)制安全
val: 字符串內(nèi)容,變長(zhǎng)struct,分配時(shí)按len長(zhǎng)度申請(qǐng)內(nèi)存
len: 字符串長(zhǎng)度,通過這個(gè)值保證二進(jìn)制安全 ,它不需要像C 一樣用喲 ‘/0’ 結(jié)尾符來判斷字符串的結(jié)束,而是通過len
C : 以 ’/0’ 為結(jié)束符,所以c的字符串不能包含文本,圖片、音頻、視頻、壓縮文件這樣的二進(jìn)制數(shù)據(jù)。
Php : 記錄 len
SDS : simple dynamic string 簡(jiǎn)單動(dòng)態(tài)字符串的抽象類型,應(yīng)用到字符表示:
SDS 數(shù)據(jù)結(jié)構(gòu):
struct sdshdr { # 記錄 buf 數(shù)組中已使用字節(jié)的數(shù)量 # 等于 SDS 所保存字符串的長(zhǎng)度 int len; # 記錄 buf 數(shù)組中未使用字節(jié)的數(shù)量 int free; # 字節(jié)數(shù)組,用于保存字符串 char buf[];};
redis 的結(jié)構(gòu)定義中也記錄了SDS所保存字符串的長(zhǎng)度,通過這個(gè)值保證二進(jìn)制安全,SDS 的 API 都會(huì)用 字符串的len 屬性來判斷字符串是否結(jié)束。
相關(guān)推薦:
php二進(jìn)制安全的含義
php的二進(jìn)制安全_PHP教程
PHP函數(shù)二進(jìn)制安全有關(guān)問題
以上就是Php關(guān)于二進(jìn)制安全詳解的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注 其它相關(guān)文章!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。
新聞熱點(diǎn)
疑難解答
圖片精選