hex2bin() 能将合法十六进制字符串(偶数长度、仅含0-9a-fa-f)严格解码为原始字节流(如utf-8字符串、emoji、二进制文件头等),但遇空格、奇数长度或非法字符即返回false或抛e_warning,故需先清洗校验再调用。

hex2bin() 能直接把合法十六进制字符串转成原始字节流(即 UTF-8 字符串、二进制数据或中文等均可),但不是所有“看着像十六进制”的字符串都能过它这关——输错一个字符、长度是奇数、混入空格,它就直接返回 false 或抛 E_WARNING。
为什么 hex2bin() 会返回 false 或报错
根本原因是它对输入极其严格:必须是偶数长度、且每个字符只能是 0-9a-fA-F。常见翻车点包括:
- 字符串带空格或换行,比如
"48 65 6c"→ 实际传入的是"48 65 6c",含空格,非法 - 长度为奇数,比如
"abc"(3位)→ PHP 5.4.1+ 会警告并返回false - 含非法字符,比如
"4g65"中的g→ PHP 5.5.1+ 报警告 - 全大写或大小写混用没问题,
"48656C"和"48656c"都合法
怎么安全调用 hex2bin() 避免崩溃
别裸调 hex2bin($str),尤其当输入来自用户、日志、API 或数据库时。务必先清洗再转换:
- 用
preg_replace('/[^0-9a-fA-F]/', '', $str)去掉所有非十六进制字符 - 用
strlen($cleaned) % 2 !== 0判断是否为奇数长度,是则补前导0(如"abc"→"0abc") - 调用前加
@抑制警告(不推荐)或用set_error_handler捕获,更稳妥的是用if (false !== $result = hex2bin($cleaned))显式判断 - 如果只是想“尽力转”,可用
pack('H*', $cleaned)替代 —— 它对非法字符更宽容(跳过或截断),但行为不如hex2bin()标准
中文、emoji、二进制文件内容都能转吗
能,只要原始字节序列本身是合法编码。例如:
-
hex2bin('e8af9a')→"菺"(UTF-8 三字节汉字) -
hex2bin('f09f988e')→"?"(UTF-8 四字节 emoji) -
hex2bin('89504e470d0a1a0a')→ PNG 文件头(\x89PNG\r\n\x1a\n),可用于校验或拼接二进制数据
注意:hex2bin() 不做字符编码转换,它只还原字节;如果你拿到的是 GBK 十六进制(如 "c4e3bac3"),还原后需用 mb_convert_encoding($bytes, 'UTF-8', 'GBK') 才能正确显示中文。
和 bin2hex() 是严格配对的吗
是,但仅限于同一编码上下文。典型闭环是:
$raw = "你好";$hex = bin2hex($raw); // → "e4bda0e5a5bd"$back = hex2bin($hex); // → "你好"
一旦中间经过 URL 编码、Base64、数据库转义或人为修改,就可能断链。另外,bin2hex() 输出永远小写,而 hex2bin() 接受大小写混合,这点不影响配对。
真正容易被忽略的是:你拿到的十六进制字符串,很可能不是纯字节序列的直译,而是被截断、补零、反转过顺序,或者根本就是某种协议自定义格式(比如 Modbus 的高位在前/低位在前)。这时候光靠 hex2bin() 不够,得先按协议解析结构,再分段转。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











