You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

十进制转两位十六进制输出异常:为何sprintf输出03而非3c?

嘿,这个问题我之前也踩过类似的坑,咱们来一步步拆解清楚~

异常原因分析

你这里的问题出在对函数参数类型的理解上:

  • dechex($br) 本身返回的就是十六进制格式的字符串(比如传入60会返回 "3c")
  • 但你把这个字符串传给 sprintf("%02x") 时,%02x 这个格式符要求的参数是整数类型。PHP会自动做类型转换,把字符串 "3c" 转成整数——而PHP处理字符串转整数时,只会读取开头的数字部分,遇到非数字字符(这里的c)就立刻停止,所以 "3c" 会被转换成整数 3。
  • 最后 sprintf("%02x", 3) 自然就输出了 "03",这就是结果不符合预期的根源。
修正方案

有两种简单直接的方式可以得到正确的两位十六进制结果:

方案一:直接用sprintf处理原整数(推荐)

sprintf() 的 %02x 格式符本身就具备“把整数转为两位小写十六进制字符串”的功能,完全不需要多此一举调用 dechex(),直接传入原数值即可:

$br = 60;
echo sprintf("%02x", $br); // 输出:3c

如果需要大写的十六进制结果(比如 "3C"),只需要把格式符改成 %02X 就行。

方案二:用str_pad补全dechex的结果

如果你因为某些业务逻辑必须保留 dechex() 的调用,可以用 str_pad() 函数给长度不足2位的十六进制字符串补上前导0:

$br = 60;
echo str_pad(dechex($br), 2, '0', STR_PAD_LEFT); // 输出:3c

$br = 5;
echo str_pad(dechex($br), 2, '0', STR_PAD_LEFT); // 输出:05

内容的提问来源于stack exchange,提问作者Jane N.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 08:27:52