|
|
1
9
正如阿卡沙解释的那样,“二进制安全”和“非二进制安全”的问题与语言无关。 使用一个空字节(0x00)来表示字符串的结尾比较简单(这可能就是C使用它的原因)。 但缺点是字符串中的任何地方都不能有空字节 如果您必须能够处理各种数据,这是一个很大的限制。 将长度存储为字符串的元数据部分更为复杂,如pete所示,但它允许您处理任何类型的数据。 关于哪些函数是“二进制安全”或“非二进制安全”, 只需阅读PHP手册 之前 使用函数。 我就是这么做的。 不需要构建一个列表,因为PHP手册已经解释了您需要了解哪些函数,包括它们是否是二进制安全的。 我相信,你的大部分文章都是因为对你引用的PHP手册的解释有误解,特别是这部分:
让我试着通过添加一些我自己的词来更清楚地表达:
所以它并没有说“非二进制安全函数将字符串交给库”,这是一种误解。 它的意思是“可以将字符串传递给忽略nul字节后数据的库的函数,在本手册中称为不二进制安全的函数”。 “移交给图书馆”只是“从其他图书馆调用函数”的另一种说法。 “忽略nul字节后的数据”是一种称为非二进制安全的行为。 另一种说法是:
我希望这能帮你清理干净。 |
|
|
2
5
传统上,有两种表示字符串的方法:使用特殊字符发送字符串结尾的信号,或将字符串长度与字符串数据一起存储。C使用前者;字符串是以空字符结尾的字符数组。但是,这有一个限制,即C中的字符串不能在任何其他地方使用空字符,只能在末尾使用空字符。 为了克服这个限制,PHP引擎使用这个结构来表示字符串:
如您所见,php开发人员选择存储字符串的长度及其数据。 现在,如果混合使用“二进制安全”和“非二进制安全”功能,会发生什么? 考虑在编写PHP扩展时可能使用的以下C代码:
你认为会发生什么?此代码输出“字符串相等!”但他们显然不平等。自
大多数C的标准库字符串函数都可以被归类为“非二进制安全”函数,因为它依赖于空终止字符。
处理时
要修复以前的代码:
现在正确打印“不相等”。 |
|
3
3
函数是否以“二进制安全”的方式处理运行时数据的问题与系统所使用的语言无关。这是一个如何处理数据的问题。PHP是一种高级语言,这意味着它具有字符串类型的高级实现。这不依赖于C所依赖的终止空字符,而是字符串类型维护有关存储字符串的元数据,这使得实现更加灵活和可靠。然而,这与是否“二进制安全”几乎没有关系。 你的其他观点不能得到明确的回答。PHP使用的库取决于您的设置,即动态环境。潜在的库如何处理移交给它们的数据与PHP函数是否可以被视为“二进制安全”没有任何关系——库不知道PHP,它只得到移交的数据,并根据库的实现方式处理这些数据。 |