Php 检查二进制字符串长度?

Php 检查二进制字符串长度?,php,Php,有没有一种本地或廉价的方法来检查PHP中字符串的字节长度?在PHP.org上。只要乘以8,就可以得到该字符串中的多少位,因为函数返回字节。字符串的长度(文本数据)由标记结束的空字符的位置决定。 在二进制数据的情况下,NULL可以并且经常处于数据的中间。 不检查二进制数据的长度。你必须事先知道。在您的例子中,长度是16(字节,而不是位,如果是UUID) 就UUID有效性而言,任何16字节的值都是有效的UUID,因此您在这方面运气不佳。请参阅 相关部分: 在PHP中,与C一样,字符串以零字符“\0”

有没有一种本地或廉价的方法来检查PHP中字符串的字节长度?

在PHP.org上。只要乘以8,就可以得到该字符串中的多少位,因为函数返回字节。

字符串的长度(文本数据)由标记结束的空字符的位置决定。 在二进制数据的情况下,NULL可以并且经常处于数据的中间。 不检查二进制数据的长度。你必须事先知道。在您的例子中,长度是16(字节,而不是位,如果是UUID)

就UUID有效性而言,任何16字节的值都是有效的UUID,因此您在这方面运气不佳。

请参阅

相关部分:

在PHP中,与C一样,字符串以零字符“\0”(char)结尾 0、空终止符、空字节或任何您喜欢的名称。“

不,事实并非如此——PHP字符串存储时同时包含长度和长度 数据,不像C字符串只有一个指针并使用终止符。他们是 “二进制安全”-NUL不终止字符串

参见zend.h中zvalue_值的定义;字符串部分有两个“char” *“val”和“int len”

如果使用mbstring.func_重载,则会出现问题,该重载会发生变化 strlen()和其他函数是如何工作的,是否尝试将字符串视为 特定编码中的字符字符串,而不是字节字符串。 这不是正常的PHP行为


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

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

$len=strlen(bin2hex($data))/2;
之所以这样做,是因为在十六进制中,对于来自
bin2hex
的所有字节,都保证获得2个字符(即使对于初始二进制0,它也会返回两个字符)


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

您有数据的示例吗?因为如果它真的只是一个字符串,我认为您没有任何替代strlen()的方法@sunetos它是一个包含16字节二进制数据的字符串,插入MySQL中的二进制字段。它不是一个由1和0组成的字符编码字符串或类似的字符串,如果这能澄清问题的话。如果你打印字符串,你会听到乱七八糟的声音。我想做的是检查16字节的数据。所以strlen应该可以有效地处理字符串g随机二进制数据?我认为strlen只提供了字符数,这就是我链接到该方法的原因。但即使是该方法看起来也是为包含字符的字符串设计的。我认为RiverC在上面给出了它。看起来如果使用mbstring。func:重载,您将失去处理二进制数据的能力使用常规PHP字符串函数。抱歉,我的意思是说字节。感谢您的解释。这是错误的。如果PHP像C一样处理字符串,这是正确的,但它显然对这个确切的问题有一些预先考虑。