十进制转两位十六进制输出异常:为何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.
相关产品推荐
相关产品推荐

