使用JavaScript将凯撒密码数组转回字符遇到问题求助
解决凯撒密码(ROT13)数组转字符的问题
嘿,看来你在ROT13的收尾环节卡壳了——把处理好的ASCII码数组转回字符串确实容易踩些小细节坑,我来帮你梳理下可行的解决思路,不用推倒重来!
首先,先拆解你试过的两种方法失效的可能原因:
- 你写的
eval('String.fromCharCode('++')')明显有语法错误,++是无效的拼接,就算改成solved.join(','),用eval也不是安全且必要的做法,不推荐。 String.fromCharCode.apply(null, solved)本身是正确的写法,但大概率是你的solved数组里藏着问题——比如混入了非数字值,或者你没正确返回转换后的结果。
具体排查&解决步骤
先确认
solved数组的内容是否正确
在函数里加一行console.log(solved),运行后看看数组里的每个元素是不是对应目标字符的ASCII码。比如原字符是L(ASCII 76),ROT13后应该是Y(ASCII 89),如果数组里出现的是字符串'Y'而不是数字89,那肯定转不出来;如果非字母字符(比如空格、感叹号)的ASCII码没正确存入数组,也会导致转换异常。修正字符串转换的写法
只要solved数组全是有效的ASCII数字,下面两种方法都能正常工作:- ES5兼容写法(你之前尝试的
apply,但要确保函数返回结果):// 在函数末尾添加 var result = String.fromCharCode.apply(null, solved); return result; - 更简洁的ES6扩展运算符写法:
return String.fromCharCode(...solved);
- ES5兼容写法(你之前尝试的
结合ROT13逻辑补全细节
大概率你可能在处理非字母字符时出现了疏漏,这里给你补一个完整的ROT13示例,你可以对照自己的代码调整:function rot13(str) { var solved = []; var arr = str.split(''); for (let char of arr) { const charCode = char.charCodeAt(0); // 只处理大写字母(ROT13默认规则) if (charCode >= 65 && charCode <= 90) { let shifted = charCode + 13; // 超过Z(90)就循环回A-Z开头 solved.push(shifted > 90 ? shifted - 26 : shifted); } else { // 非字母字符直接保留原ASCII码 solved.push(charCode); } } // 转换为字符串并返回 return String.fromCharCode(...solved); } // 测试:输入LBH QVQ VG! 应该输出 YOU DID IT! console.log(rot13("LBH QVQ VG!"));
容易忽略的误区
- 忘记return结果:如果你的函数最后没有返回转换后的字符串,就算转换成功,调用
rot13()也拿不到结果,document.write自然没输出。 - 数组混入非数字:如果你不小心把原字符(比如
' ')直接push进solved而不是它的ASCII码(32),String.fromCharCode会把非数字值当成NaN,转换后变成空字符或乱码。
你已经完成了大部分逻辑,只要排查下数组内容和返回步骤的小问题,很快就能搞定啦!
内容的提问来源于stack exchange,提问作者chauxvive
相关产品推荐
相关产品推荐

