检查二进制字符串长度?

Gre*_*reg 9 php

是否有一种本地或廉价的方法来检查PHP中字符串的长度(以字节为单位)?

小智 20

http://bytes.com/topic/php/answers/653733-binary-string-length

相关部分:

" 在PHP中,就像在C中一样,字符串以零字符结尾,'\ 0',(字符)0,空终止符,空字节或任何你喜欢称之为的字符串."

不,情况并非如此 - PHP字符串与长度和数据一起存储,这与只有一个指针并使用终结符的C字符串不同.它们是"二进制安全的" - NUL不会终止字符串.

请参阅zend.h中zvalue_value的定义; 字符串部分同时具有"char*val"和"int len".

如果您正在使用mbstring.func_overload,它会改变strlen()和其他函数的工作方式,并尝试将字符串视为特定编码中的字符串而不是字符串.这不是正常的PHP行为.

答案是strlen应该返回字节数,而不管字符串的内容如何.对于多字节字符串,您获得的字符数错误,但字节数正确.但是,您需要确定您没有使用mbstring重载,这会更改strlen的行为方式.


v01*_*dya 6

如果您设置了mbstring重载,或者您正在为不确定该设置的平台进行开发,则可以执行以下操作:

$len=strlen(bin2hex($data))/2;
Run Code Online (Sandbox Code Playgroud)

之所以起作用,是因为在十六进制中,确保您为来自的所有字节获取2个bin2hex字符(即使对于初始二进制0,它也返回两个字符)。

请注意,它将比正常使用更多的资源strlen(毕竟,因此,如果不是绝对必要的话,绝对不要对大量数据执行此操作。


zvo*_*one -10

字符串(文本数据)的长度由标记结束的 NULL 字符的位置确定。对于二进制数据,NULL 可以而且经常出现在数据中间。

您不检查二进制数据的长度。你必须事先知道它。在您的情况下,长度为 16(字节,而不是位,如果它是 UUID)。

就 UUID 有效性而言,任何 16 字节值都是有效的 UUID,所以你运气不好。

  • 这是不正确的。如果 PHP 像 C 那样处理字符串,那是正确的,但它显然对这个确切的问题有一些深思熟虑。 (3认同)