二进制

php是以c为基础的,所以很多描述都是以c为准。c的字符串里,一种经典的定义就是,以编码0作为字符串的结尾。

c代码示例:

?
1
2
3
4
5
6
main(){
     char  ab[] =  "aa\0b" ;
     char  ac[] =  "aa\0c" ;
     printf ( "%d\n" strcmp (ab, ac));
     printf ( "%d\n" strlen (ab));
  }

c语言会认为ab和ac是相等的。因为在c语言中是以\0作为结尾的。

同样的在php中。

?
1
2
3
4
5
6
<?php
     $ab  "hello"
     $ac  "hello\x00Hello" ;
     var_dump( strcmp ( $ab $ac ));
     var_dump( strlen ( $ab ));
?>

结果依次为0,11.

strcmp是判断两个字符串是否相等非二进制安全,相等会返回0,不等则返回1.

strlen是判断字符串的长度,二进制安全。

会发现非二进制安全会误判为相等。

那么php是如何做到二进制安全的呢。

php会根据type的值决定访问某个成员。为字符串时,php会记录val的指针和字符串的长度len,当需要进行判断时,php会直接获取到type的值不需要和c一样去判断字符串末尾的\0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值