Javascript 来自.charCodeAt()的ROT13密码?

Javascript 来自.charCodeAt()的ROT13密码?,javascript,char,fromcharcode,Javascript,Char,Fromcharcode,我是javascript新手,这是基础算法脚本的最后一门课程。我正在努力理解这一行代码,因为我在免费代码营获得前端开发证书的下一部分,我想了解所有内容。我一直在寻找解决方案,并找到了这一点。我理解注释中的一些行,但是我很难理解公式,这段代码100%有效,但我需要进一步理解。代码如下: 函数rot13(str){ //retCharArray是解决方案的字符代码数组 var Rotcharray=[]; //从A到Z的所有大写字母的正则表达式 var regEx=/[A-Z]/; //将str拆

我是javascript新手,这是基础算法脚本的最后一门课程。我正在努力理解这一行代码,因为我在免费代码营获得前端开发证书的下一部分,我想了解所有内容。我一直在寻找解决方案,并找到了这一点。我理解注释中的一些行,但是我很难理解公式,这段代码100%有效,但我需要进一步理解。代码如下:

函数rot13(str){
//retCharArray是解决方案的字符代码数组
var Rotcharray=[];
//从A到Z的所有大写字母的正则表达式
var regEx=/[A-Z]/;
//将str拆分为字符数组
str=str.split(“”);
对于(str中的varx){//迭代数组中的每个字符
//test(str[x])将返回(true或false),如果它是否处理正则表达式
if(正则表达式测试(str[x])){
//更一般的方法
//可能是因为模运算
//rot13变换的循环性质
//我不清楚下面的代码
rotcharray.push((str[x].charCodeAt()-65+13)%26+65);
}否则{
push(str[x].charCodeAt());
}
}
//从字符代码数组中生成包含字符代码的字符串
str=String.fromCharCode.apply(String,rotcharray);
返回str;
}
//将下面的输入更改为测试

rot13(“SDASSD”)由于您只使用大写字符,因此需要了解您使用的字符代码范围。大写字母“A”对应于65

'A'.charCodeAt(0)
返回
65

最大值为“Z”,对应于
90

英语字母表中有26个字符。这就是为什么应用13的cypher旋转,然后应用模运算

为了检索正确的字符码,将65再次添加到结果中


rotcharray.push((str[x].charCodeAt()-65+13)%26+65)

由于您只使用大写字符,因此需要了解您使用的字符代码范围。大写字母“A”对应于65

'A'.charCodeAt(0)
返回
65

最大值为“Z”,对应于
90

英语字母表中有26个字符。这就是为什么应用13的cypher旋转,然后应用模运算

为了检索正确的字符码,将65再次添加到结果中


rotcharray.push((str[x].charCodeAt()-65+13)%26+65)
这意味着

  • 获取字符码(介于65和90之间)减去65
  • 加13
  • 获取26的模(这确保编码不会加密到“Z”字母以上的任何内容,例如,“Z”字母将转换为
    (90-65+13)%26+65)=77
    “M”字母。本质上,它将使加密算法循环到开始
  • 加上65

  • 首先。该代码仅转换大写字母(请参见下面的ascii表格)

    这意味着

  • 获取字符码(介于65和90之间)减去65
  • 加13
  • 获取26的模(这确保编码不会加密到“Z”字母以上的任何内容,例如,“Z”字母将转换为
    (90-65+13)%26+65)=77
    “M”字母。本质上,它将使加密算法循环到开始
  • 加上65

  • 上面的两个答案在回答您的问题时已经走了一半,但它们并没有真正看到您的问题,即要回答自由代码营挑战,您必须开始理解凯撒密码和ROT13算法背后的数学。我也有这个问题

    让我们一起看,一步一步地看。(我不明白不是每个人在高中都学过这个——我没有!)

    @bastos.sergio和@caulitomaz的答案都有帮助,但它们只是部分解释了问题,并没有让你进一步研究:

    @巴斯托斯,塞尔吉奥

    “获取26的模(这确保编码不会 加密到“Z”字母以上的任何内容,例如“Z”字母 将转换为(90-65+13)%26+65)=77'M'字母。本质上, 它将使加密算法循环到最开始。”

    @卡里托马兹氏

    英语字母表中有26个字符。这就是你申请的原因 将cypher旋转13,然后应用模运算

    他们在这里都指的是“模运算”

    模运算表明,一些数字是“全等的”,也就是说,当对它们应用模运算时,它们共享相同的余数

    例如,2%12、14%12、26%12=余数2。这样,当您有必须出现在某个范围内的数字,或设备仅显示某个范围内的数字时,您就可以计算出该数字“循环”的位置

    请注意,在我的示例中,使用了%12-这是12小时时钟可以显示的总小时数。如果是凌晨2点,我想知道12小时后的时间,我加上12。但是我的时钟不能显示14:00(不是在12小时模式下)。模12给了我实时性

    例如: 现在是凌晨4点。我的飞机延误了29小时(这是一家糟糕的航空公司)。我如何计算新的起飞时间?4+29%12=上午9点。(如果延迟小于24,我需要切换am/pm,但您应该能看到图片。)

    ROT13

    这里我们有一个ROT 13旋转密码的特例,其中应用两次密码将得到要编码的原始字符,因为字母表只有26个字符,13正好是26的一半

    (str[x].charCodeAt() - 65 + 13) % 26 + 65
    
      // I DON'T CLEARLY UNDERSTAND THIS CODE BELOW
      rotCharArray.push((str[x].charCodeAt() - 65 + 13) % 26 + 65);
    } else {
      rotCharArray.push(str[x].charCodeAt());
    }
    
    'X'.charCodeAt(0) = 88
    
    - 65 = 23 
    
    + 13 = 36
    
    %26 = 10 
    
    +65 = 75 
    
    charCodeFrom(75) = K
    
    'K'.charCodateAt(0) = 75
    
    - 65 = 10
    
    + 13 = 23
    
    %26 = 23
    
    +65 = 88
    
    charCodeFrom(88) = X