← PHP hebrev()函数教程:希伯来文视觉文本转换、maxcharline参数与经验 PHP htmlentities()函数:字符转HTML实体教程 →

PHP hex2bin()十六进制转ASCII字符函数详解

著
原创 2026-10-10 PHP 已有人查阅

一、函数定位与核心概念

hex2bin()是PHP内置的字符串处理函数,作用是将十六进制字符串还原为对应的ASCII字符序列。这里需要先厘清一个常见误解:它并不是把十六进制数转成二进制数,而是把“十六进制表示”翻译成“字符本身”。

从底层看,十六进制字符串每两个字符代表一个字节。例如48对应ASCII码的H,65对应e。hex2bin()做的就是逐对解析,把每两个十六进制字符合成一个字节,最终返回原始字符串。

函数签名:

hex2bin(string $data): string|false

参数$data为必填项,必须是偶数长度的十六进制字符串。如果长度为奇数,或者包含非十六进制字符,函数会返回false并触发警告。

二、基础用法与代码号学习编程示例

先看一个最简单的例子,把十六进制串还原为可读文本:

<?php
$hex = "48656c6c6f20576f726c6421";
echo hex2bin($hex);
?>

输出:

Hello World!

再结合var_dump()观察返回类型和长度:

<?php
$hex = "6578616d706c65206865782064617461";
$result = hex2bin($hex);
var_dump($result);
?>

输出:

string(16) "example hex data"

这两个示例说明:hex2bin()返回的是字符串类型,长度等于十六进制串长度的一半。示例中6578616d706c65206865782064617461共32个字符,还原后得到16字节的字符串。

三、参数细节与返回值边界

hex2bin()对输入有明确要求:

  • 字符串长度必须为偶数。奇数长度会直接失败,因为无法配对成完整字节。

  • 只接受0-9、a-f、A-F。出现g、z、空格、换行等字符都会导致返回false。

  • 大小写不敏感,4A和4a都能正常解析。

下面这段代码演示了错误输入的处理方式:

<?php
$badHex = "48656c6c6f2"; // 长度为奇数
$result = @hex2bin($badHex);
var_dump($result);
?>

输出:

bool(false)

实际项目中,建议在调用前做一次校验:

<?php
function safeHex2Bin(string $hex): string|false
{
    if (strlen($hex) % 2 !== 0) {
        return false;
    }
    if (!ctype_xdigit($hex)) {
        return false;
    }
    return hex2bin($hex);
}
?>

ctype_xdigit()可以快速判断字符串是否只包含十六进制字符,比正则更轻量。

四、与bin2hex()的关系

hex2bin()的逆向操作是bin2hex()。两者常配合使用,用于二进制数据的安全传输和存储。

<?php
$original = "code number 88";
$hex = bin2hex($original);
echo $hex . PHP_EOL;
echo hex2bin($hex) . PHP_EOL;
?>

输出:

636f6465206e756d626572203838
code number 88

这种往返转换在加密、哈希、网络协议解析中很常见。比如把随机字节转成十六进制存入数据库,读取时再还原。

五、项目反思与踩坑经历

踩坑一:把hex2bin()当成进制转换工具

早期接手一个物联网数据解析项目,设备上报的是十六进制字符串,需要转成二进制流再解析协议。当时误以为hex2bin()会把1A转成二进制11010,结果实际得到的是ASCII字符。后来改用base_cort()或pack()才解决。记住:hex2bin()输出的是字符,不是二进制数字串。

踩坑二:忽略奇数长度导致线上警告

有一次处理用户上传的十六进制令牌,部分数据因为截断变成奇数长度,hex2bin()直接返回false并抛警告。日志里大量警告拖慢了响应。后来在入口统一用ctype_xdigit()和长度判断做前置过滤,问题消失。

踩坑三:编码不一致导致乱码

hex2bin()还原的是字节序列,不负责字符编码。如果原始数据是UTF-8中文,还原后直接输出到GBK页面就会乱码。正确做法是还原后再用mb_cort_encoding()转码,或者确保全链路统一UTF-8。

经验建议

  • 处理外部输入的十六进制串,先校验再转换,不要直接信任。

  • 如果只是想把十六进制数转成十进制或二进制字符串,用hexdec()或base_cort(),不要用hex2bin()。

  • 大文件不要一次性hex2bin(),内存会翻倍。可以分段处理,每段保持偶数长度。

  • 调试时用bin2hex(hex2bin($hex))===strtolower($hex)验证往返一致性。

六、本节课程知识要点

  • hex2bin()将十六进制字符串转为ASCII字符序列,每两个十六进制字符对应一个字节。

  • 输入必须为偶数长度且只含十六进制字符,否则返回false。

  • 返回值为字符串类型,长度为输入长度的一半。

  • 与bin2hex()互为逆操作,常用于二进制数据的安全表示。

  • 不负责字符编码转换,编码问题需另行处理。

  • 外部输入应先校验,避免警告和性能损耗。

七、扩展应用场景

场景一:解析网络协议包

很多二进制协议用十六进制抓包展示。拿到48656c6c6f后,用hex2bin()还原成Hello再按字段切割。

场景二:还原加密盐值

部分系统把随机盐值以十六进制存储。读取时:

<?php
$saltHex = "a1b2c3d4e5f6";
$salt = hex2bin($saltHex);
?>

场景三:处理图片二进制头

验证图片类型时,可读取前几个字节的十六进制,还原后比对魔数:

<?php
$pngHeaderHex = "89504e470d0a1a0a";
$header = hex2bin($pngHeaderHex);
if (str_starts_with($header, "\x89PNG")) {
    echo "这是 PNG 图片";
}
?>

这类用法在文件上传校验中很实用。

hex2bin()是一个轻量但容易误解的函数。它的核心价值在于十六进制表示与原始字节之间的还原,而不是进制换算。掌握它的参数约束、返回值边界以及与bin2hex()的配合方式,能在协议解析、数据存储、安全校验等场景中少走弯路。项目里多一层输入校验,少一次线上警告,这是值得养成的习惯。

← PHP hebrev()函数教程:希伯来文视觉文本转换、maxcharline参数与经验 PHP htmlentities()函数:字符转HTML实体教程 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号