Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ROT13函数仅部分工作_Javascript_Caesar Cipher_Rot13 - Fatal编程技术网

Javascript ROT13函数仅部分工作

Javascript ROT13函数仅部分工作,javascript,caesar-cipher,rot13,Javascript,Caesar Cipher,Rot13,我的ROT13 JS函数在大部分情况下都可以正常工作,但有些字符出现错误,例如,HELLO返回时带有U,R,Y,Y,\ 谁能给我解释一下我做错了什么 我在做免费密码挑战赛 函数rot13(str){//LBH QVQ VG! var stringArray=str.split(“”); var stringArray2=[]; var stringArray3=[]; for(stringArray中的变量i){ var y=stringArray[i].charCodeAt(); y+=13

我的ROT13 JS函数在大部分情况下都可以正常工作,但有些字符出现错误,例如,
HELLO
返回时带有
U,R,Y,Y,\

谁能给我解释一下我做错了什么

我在做免费密码挑战赛

函数rot13(str){//LBH QVQ VG!
var stringArray=str.split(“”);
var stringArray2=[];
var stringArray3=[];
for(stringArray中的变量i){
var y=stringArray[i].charCodeAt();
y+=13;
stringArray2.推力(y);
}
用于(stringArray2中的变量u){
var x=String.fromCharCode(stringArray2[u]);
stringArray3.推力(x);
}
var transformed=stringArray3.join().toString();
收益转化;
}
//将下面的输入更改为测试

console.log(rot13(“HELLO”)我想为您提供ROT13函数的替代方案

我提出的另一种选择是使用常规的Caesar密码算法——一种非常简单的加密形式,即原始消息中的每个字母向左或向右移动一定数量的位置

要解密消息,我们只需将字母向后移动相同的位置数

例如:

  • 如果我们将所有字母移动3个位置,JAVASCRIPT将变成MDYDVFULSW
  • 如果我们将所有字母向后移动3个位置,MDYDVFULSW将返回JAVASCRIPT
如果字母移位后超出了字母范围,则字母将用字母表包裹。示例:如果字母Z移动3个位置,则字母Z变为C

这种“环绕”效应意味着使用模。在数学术语中,上述可表示为:

En(x)=(x+n)模块26

Dn(x)=(x–n)模块26

如果试图在JavaScript中实现该算法而不使用适当的模运算符,则会产生不正确的结果,或者产生非常隐晦且难以理解的代码

最大的问题是JavaScript不包含模运算符。%运算符只是除法的提醒,而不是模。但是,将模作为自定义函数实现非常容易:

// Implement modulo by replacing the negative operand 
// with an equivalent positive operand that has the same wrap-around effect
function mod(n, p)
{
    if ( n < 0 )
        n = p - Math.abs(n) % p;

    return n % p;
}
//通过替换负操作数实现模运算
//使用具有相同环绕效果的等效正操作数
功能模块(n,p)
{
if(n<0)
n=p-数学绝对值(n)%p;
返回n%p;
}
还有其他实现模运算的方法。。。如果你感兴趣,你可以参考这个

通过使用上面定义的mod函数,代码以相同的方式表示数学方程:

// Function will implement Caesar Cipher to
// encrypt / decrypt the msg by shifting the letters
// of the message acording to the key
function encrypt(msg, key)
{
    var encMsg = "";

    for(var i = 0; i < msg.length; i++)
    {
        var code = msg.charCodeAt(i);

        // Encrypt only letters in 'A' ... 'Z' interval
        if (code >= 65 && code <= 65 + 26 - 1)
        {
            code -= 65;
            code = mod(code + key, 26);
            code += 65;
        }

        encMsg += String.fromCharCode(code);
    }

    return encMsg;
}
//函数将对
//通过移动字母对消息进行加密/解密
//根据密钥设置消息的
函数加密(消息,密钥)
{
var encMsg=“”;
对于(变量i=0;i=65&&code
函数rot13(str){
str=str.split(“”);
职能a(项目){
让结果;
如果(item.charCodeAt()>=65&&item.charCodeAt()=78&&item.charCodeAt()a(item)).join(“”);
console.log(str);
返回str;
}
rot13(“GUR DHVPX OEBJA SBK WHZCF BIRE GUR YNML QBT”);

欢迎使用SO!您能提供一个函数不起作用的示例吗,如输入:…,预期:…,但得到:….当然,很抱歉没有首先将其包含在条目中!“HELLO”返回时带有“U,R,Y,Y,\”谢谢!好的,两个问题:第一(次要):您需要
.join(“”)
,而不仅仅是
.join()
去掉逗号。第二(主要):这东西叫做“腐烂”原因:当
y+13
大于
Z
时,它应该旋转并从头开始,也就是说,
Z+13
应该给
a+12
等等。我明白了,现在我这样想它看起来很明显!我想我对这个问题的其他方面想得太深了!谢谢,这真的澄清了问题发生了什么事!
function rot13(str) {
  str = str.split("");
  function a(item){
    let result;
    if (item.charCodeAt()>=65&&item.charCodeAt()<78){
      result= String.fromCharCode(item.charCodeAt()+13); 
    }
    else if(item.charCodeAt()>=78&&item.charCodeAt()<=95){
      result= String.fromCharCode(item.charCodeAt()-13);
    }
    else{
      result = item;
    }
    return result;
  }
  str = str.map(item=>a(item)).join("");
  console.log(str);
  return str;
}

rot13("GUR DHVPX OEBJA SBK WHZCF BIRE GUR YNML QBT.");