二进制安全(binary safe)是一种主要用于字符串操作函数相关的计算机编程术语。一个二进制安全函数,其本质上将把输入内容作为原始的、无任何特殊格式意义的数据流进行处理。“二进制安全”这个术语在PHP手册中广泛使用,用来描述向字符串处理函数传递数据时的预期行为。

举个例子:
C语言中的strlen函数就不是二进制安全的,因为它依赖于特殊的字符’\0’来判断字符串是否结束,所以对于字符串str = “1234\0123″来说,strlen(str)=4
而在PHP语言中,strlen函数是二进制安全的,因为它不会对任何字符(包括’\0’)进行特殊解释,所以在PHP中,strlen(str)=8


所以,二进制安全的意思是:只关心二进制化的字符串数据流,不关心里面的具体文本.只会严格的按照二进制进行存取,不会尝试解析里面的数据内容。


同样的, redis中SDS(simple dynamic string)抽象类型的实现保证了redis保存的数据是二进制安全的:

struct sdshdr {
    int len;
    int free;
    char buf[];
};
SDS示例(存储的字符串为”Redis”)

1、len 变量,用于记录buf 中已经使用的空间长度(这里指出Redis 的长度为5)
2、free 变量,用于记录buf 中还空余的空间(初次分配空间,一般没有空余,在对字符串修改的时候,会有剩余空间出现)
3、buf 字符数组,用于记录我们的字符串(记录Redis)

如上图所示,SDS并不像C语言字符串那样, 使用’\0’表示一个字符串的结尾,而是使用了独立的len字段来保存字符串长度,这样可以保证即使存储的数据中有’\0’这样的字符,也可以正常读取。

发表评论

Post Navigation