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

使用JavaScript将凯撒密码数组转回字符遇到问题求助

解决凯撒密码(ROT13)数组转字符的问题

嘿,看来你在ROT13的收尾环节卡壳了——把处理好的ASCII码数组转回字符串确实容易踩些小细节坑,我来帮你梳理下可行的解决思路,不用推倒重来!

首先,先拆解你试过的两种方法失效的可能原因:

  • 你写的eval('String.fromCharCode('++')')明显有语法错误,++是无效的拼接,就算改成solved.join(','),用eval也不是安全且必要的做法,不推荐。
  • String.fromCharCode.apply(null, solved)本身是正确的写法,但大概率是你的solved数组里藏着问题——比如混入了非数字值,或者你没正确返回转换后的结果。

具体排查&解决步骤

  1. 先确认solved数组的内容是否正确
    在函数里加一行console.log(solved),运行后看看数组里的每个元素是不是对应目标字符的ASCII码。比如原字符是L(ASCII 76),ROT13后应该是Y(ASCII 89),如果数组里出现的是字符串'Y'而不是数字89,那肯定转不出来;如果非字母字符(比如空格、感叹号)的ASCII码没正确存入数组,也会导致转换异常。

  2. 修正字符串转换的写法
    只要solved数组全是有效的ASCII数字,下面两种方法都能正常工作:

    • ES5兼容写法(你之前尝试的apply,但要确保函数返回结果):
      // 在函数末尾添加
      var result = String.fromCharCode.apply(null, solved);
      return result;
      
    • 更简洁的ES6扩展运算符写法:
      return String.fromCharCode(...solved);
      
  3. 结合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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:56:32