在看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(){  char ab[] = "Hello";  char ac[] = "Hello\0Hello";  strcmp(ab, ac); /*返回0, 由于是非二进制安全,误判为相等 */}

有一个二进制安全的定义,我挺喜欢的:

程序不会对其中的数据做任何限制、过滤、或者假设 —— 数据在写入时是什么样的, 它被读取时就是什么样。

PHP是如何实现二进制安全的?

那么,既然PHP是基于C实现的,C 字符串类型不是二进制安全的,PHP又是如何实现的呢?这就是数据结构的功劳了。 PHP的内核中,是如此定义字符串类型的

struct{char *val;int len;
} str;

val是指向字符串内存的指针,len表示该字符串的长度,无论是否遇到“\0”字符,C都按照len长度读取该字符串。

原文链接:http://wuxinjie.github.io/php-02/

php手册经常见到,什么是“二进制安全”?相关推荐

  1. mysql临时开启二进制_关于MySQL二进制日志Binlog的认识

    MySQL的二进制日志可以说或是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是失误安全型的. 在 ...

  2. 如何用 Bash 创建一个二进制发布包

    linux下安装JDK的时候,Sun公司为JDK6的linux版本提供了一个shell的安装包,用起来特别的好用,基本上和在Windows下安装软件没什么两样,shell文件执行之后,几乎一切都系都设 ...

  3. rpm、yum、编译安装轻松管理centos7程序包

    程序包管理器之RPM 一.rpm是什么 RPM 是RPM Package Manager(RPM软件包管理器)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的.RPM ...

  4. Mac环境PHP踩过的“坑” (一)函数重载

    为什么80%的码农都做不了架构师?>>>    零.问题¶ 在Mac下开发本来很高兴,可是有一个地方把人恶心到了,Apache+Mod_PHP方式,出现了一个strtoupper(' ...

  5. php session gc_maxlifetime,PHPsession 有效期 session.gc_maxlifetime

    PHPsession 有效期 session.gc_maxlifetime 一个已知管用的方法是, 使用 session_set_save_handler, 接管所有的 session 管理工作, 一 ...

  6. Linux系统程序包管理工具-RPM

    一.rpm是什么 RPM 是RPM Package Manager(RPM软件包管理器)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的.RPM包管理器(RPM)是一 ...

  7. rpm、yum、编译安装轻松解决centos7程序包安装

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 程序包管理器之RPM 一.rpm是什么 RPM 是RPM Package Manager(RPM软件包管理器)的 ...

  8. Solaris 问答集

    1.Q:Solaris的系统配置文件一般在什么地方? A:可以查看/etc/system文件,里面有一些solaris启动时默认加载的选项,包括 共享内存大小等的设置. 2.Q:在solaris中,用 ...

  9. 三菱PLC MC协议的配置和使用简析

    1.三菱MC协议的目的 MC协议的目的是开放PLC内部寄存器给外部设备,实现外部设备和PLC的数据交互.简单说就是允许外部设备通过MC协议来读/写PLC里面的寄存器 2. 通信协议方式 通讯方式有48 ...

  10. STM32 F7的MAC层过滤使用+实例代码

    前景描述 我司的以太网实现是LAN8720搭配片上MAC层做的,协议栈用LWIP 这种做法应该还是蛮常见的,反正不是LAN8720就是DP83864,再不然就是硬件协议栈的W5500了 想想还是有MA ...

最新文章

  1. 【转】HTTP Header 详解
  2. git 获取最新代码_常用命令之git操作(入门篇)
  3. 全局性事务控制如何在springboot中配置
  4. java 同步锁_java线程中的同步锁和互斥锁有什么区别?
  5. java压缩----使用sun JDK压缩--中文的文件名会是乱码
  6. [USACO18JAN][luoguP4183 ]Cow at Large P
  7. dotNet Core使用SignalR实现websocket
  8. java正则匹配英文句号_Scala 正则表达式 0411
  9. 【BZOJ3514】Codechef MARCH14 GERALD07加强版,LCT+主席树
  10. docker mysql8
  11. [GXOI/GZOI2019]宝牌一大堆(dp)
  12. Socket开发框架之框架设计及分析
  13. [渝粤教育] 重庆工程职业技术学院 Linux服务器配置与管理(唐宏) 参考 资料
  14. Mean filter 和 Gaussian filter对比
  15. msn自身头像存放位置
  16. Kali Linux 暴力破解 Excel密码
  17. 车路协同场景身份认证及 V2X 通信安全保障
  18. unity怪物攻击玩家减血_Unity-塔防游戏之怪物波次简单算法
  19. 美面魔心伊莉丝:会有蜘蛛之神制裁你
  20. SRC挖掘信息收集之JS文件中的秘密

热门文章

  1. Angular7入门辅助教程(六)——Subject(可多播的可观察对象)
  2. 多余的回车键(Enter)
  3. Echarts地图深入+散点
  4. elementui表格合计自定义,尾行自定义
  5. W3C(万维网联盟)
  6. 开源推荐 - CoDo开源一站式DevOps平台
  7. 自建公众号服务器开发教程,01-微信公众号开发入门篇
  8. 浪潮配置ipim_浪潮服务器管理口IP设置_IPMI设置
  9. 记录navicat客户端对个别字段类型设置长度保存后变为0的原因
  10. U盘和移动硬盘不能安全删除问题及解决方案