检查二进制字符串长度?

时间:2010-07-14 00:34:36

标签: php

在PHP中检查字符串的长度是否有原生或廉价的方法?

4 个答案:

答案 0 :(得分:19)

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

相关部分:

  
    

在PHP中,与在C中一样,字符串以零字符结尾,'\ 0',(char)     0,null-terminator,null-byte或任何你喜欢称之为的。“

  
     

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

     

参见zend.h中zvalue_value的定义;字符串部分都有一个“char   * val“和”int len“。

     

如果您正在使用更改的mbstring.func_overload,问题就会开始   strlen()和其他函数如何工作,并尝试将字符串视为   特定编码中的字符串而不是字节串。   这不是正常的PHP行为。

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

答案 1 :(得分:3)

在php.org上,someone was nice enough to create this function。只需乘以8,你就可以在该字符串中找到很多位,因为该函数返回字节。

答案 2 :(得分:2)

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

$len=strlen(bin2hex($data))/2;

这样做的原因是,在Hex中,保证为来自bin2hex的所有字节获得2个字符(即使初始二进制0也返回两个字符)。

请注意,它将使用比普通strlen更多的资源(毕竟,如果不是绝对必要的话,你绝对不应该对大量数据这样做。

答案 3 :(得分:-4)

字符串的长度(文本数据)由标记结尾的NULL字符的位置确定。 在二进制数据的情况下,NULL可以并且经常位于数据的中间。

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

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