PHP解密加密邮箱函数末尾字符缺失:Python转PHP逻辑排查
问题分析与修复方案
嘿,我一眼就看到问题出在哪了,咱们一步步拆解你的PHP函数和原Python逻辑的差异:
核心错误点1:foreach循环的变量搞反了
原Python代码里,range(2, len(e)-1, 2)生成的是从2开始、步长为2的起始位置序列,循环变量i直接就是每次截取字符串的起始索引。但你的PHP代码里,foreach(range(...) as $i => $v)中,$i是数组的索引(从0开始递增的数字),而$v才是对应Python里i的真实起始位置!你错误地用$i去做字符串截取,这直接导致起始位置完全跑偏。
核心错误点2:substr的参数逻辑错误
Python的e[i:i+2]是从位置i开始,取固定2个字符;而PHP的substr($e, $start, $length)第三个参数是截取长度,不是结束位置。你写的substr($e,$i,$i+2)完全搞错了规则,应该固定传2作为长度。
修正后的PHP函数
function decode($e){ $de = ""; $c = substr($e, 0, 2); $k = hexdec($c); // 用$v获取range生成的真实起始位置,而非数组索引$i foreach(range(2, strlen($e)-1, 2) as $v){ // 从$v位置开始截取固定2个字符 $s = substr($e, $v, 2); $d = hexdec($s); $de .= chr($d ^ $k); } return $de; }
测试验证
用你提供的输入值caaba0a3bea28af9fcfabfabaeb9e4a9a5a7测试修正后的函数,会正确返回ajith@360uads.com,完全匹配预期结果。
额外说明
原Python代码里range(2, len(e)-1, 2)的终止条件len(e)-1,在PHP的range(2, strlen($e)-1, 2)中是完全一致的——因为range的结束值是包含的,刚好覆盖到最后一组两个字符的起始位置,不会遗漏末尾的字符。
内容的提问来源于stack exchange,提问作者sdx11
相关产品推荐
相关产品推荐

