PHP中二进制字符串长度应直接用strlen()获取字节数,它准确、高效、兼容null字节;需先校验数据有效性,避免false或空串;大文件优先用元信息而非全量加载。

用 strlen() 直接获取二进制字符串字节数
PHP 中的二进制数据(比如从 fread()、socket_read() 或 pack() 得到的字符串)本质仍是 string 类型,底层是字节序列。所以判断“长度”最常用也最准确的方式就是 strlen() ——它返回的是字节数,不是字符数,天然适配二进制场景。
注意:别用 mb_strlen($str, '8bit') 或其他 mb_* 函数绕路,除非你明确在处理多字节编码且需要兼容某些特殊逻辑;对纯二进制数据,strlen() 更快、更直接、无编码干扰。
-
strlen()返回的是原始字节数,和ord($str[0])、$str[5]这类下标访问完全对齐 - 若字符串含 null 字节(
"\x00"),strlen()仍正确计数,不会像 C 风格字符串那样截断 - 避免误用
count($str)或sizeof($str)—— 这俩对字符串返回 1,毫无意义
区分「字节长度」和「位长度」时用 strlen() * 8
多数场景下,“二进制字符串长度”指字节数(例如协议头里写的 “length: 4 bytes”),但偶尔需换算成总位数(如做位运算、构造 bitfield、校验 CRC)。这时只需乘以 8:
$bin = "\xFF\x0A\x3C"; echo strlen($bin); // 输出 3 echo strlen($bin) * 8; // 输出 24
无需额外函数或扩展。只要确认数据确实是按字节存储的二进制串(而非 base64 编码后字符串),这个换算就严格成立。
立即学习“PHP免费学习笔记(深入)”;
- 如果源数据是 base64 编码(如
"AAECAw=="),必须先base64_decode()再用strlen(),否则得到的是编码后长度 - 不要对十六进制字符串(如
"ff0a3c")直接用strlen()—— 它长度是 6,但对应真实二进制只有 3 字节,需用hex2bin()转换后再测
遇到空字符串或 false 时检查来源是否出错
常见陷阱不是函数用错,而是上游读取失败却没校验返回值,导致传给 strlen() 的是 false 或空串:
$data = fread($fp, 1024); var_dump($data); // 可能是 false(读取失败)或 ""(EOF 或超时) echo strlen($data); // false → 0,"" → 0,二者语义完全不同
务必在调用 strlen() 前确认数据有效性:
- 用
is_string($data) && $data !== ''排除空/失败情况 - 对 socket 或 stream 操作,检查
fread()是否返回false(错误)或0(连接关闭) - 若依赖
getimagesizefromstring()等函数解析二进制,它们可能返回false,不能直接丢给strlen()
大文件二进制数据不建议全量加载后测长
当处理几十 MB 以上的二进制流(如上传文件、日志块),用 strlen() 意味着把全部内容载入内存。此时应优先通过元信息获取长度:
- HTTP 上传时查
$_FILES['x']['size'],比读文件再strlen()快且安全 - 读文件前用
filesize($path),比file_get_contents()+strlen()节省内存 - 如果是分块读取(
fread($fp, 8192)),每次只测当前 chunk 长度,不累计全量
真正需要运行时动态测长的,往往是协议解析或加密场景;其他情况,长度通常已知或可预估——硬算反而暴露设计缺陷。











