【问题标题】:Caesar Cipher technique and reverse case in javascriptjavascript中的凯撒密码技术和反向大小写
【发布时间】:2021-11-27 12:16:52
【问题描述】:

我是初学者,想制作自己的功能。 我想通过将每个字符移动给定 x 来散列密码 位置并反转为小写/大写。

我认为下面的代码应该返回“EFGH7654”,但它返回 55 且没有错误消息。 我该如何解决?是因为我把一个函数放在一个函数中吗? 还是我打错了什么?

function hashPassword(password, x) {
  // password is a string, x is a number
  // return a string
  // (ex. password = 'ab1By', x = 3 so it should return "DE4eB")
  function shift(text, s) {
    result = "";
    for (let i = 0; i < text.length; i++) {
      let char = text[i];
      if (char.toUpperCase(text[i])) {
        let ch = String.fromCharCode((char.charCodeAt(0) + s - 65) % 26 + 65);
        result += ch;
      } else {
        let ch = String.fromCharCode((char.charCodeAt(0) + s - 97) % 26 + 97);
        result += ch;
      }
    }
    return result;
  }

  function reversecase(x) {
    var output = '';
    for (var i = 0, len = x.length; i < len; i++) {
      var character = x[i];
      if (character == character.toLowerCase()) {
        // The character is lowercase
        output = output + character.toUpperCase();
      } else {
        // The character is uppercase
        output = output + character.toLowerCase();
      }
    }
    return output
  }

  var str = "";
  var result = "";
  var charcode = "";
  for (var i = 0; i < password.length; i++) {
    if (typeof password[i] === typeof str) {
      char = shift(password[i], x)
      charcode = reversecase(char)
      result += charcode;
    } else {
      num = password[i] + x
      number = num % 10
      result += number.toString()
    }
  }
  return result
};
console.log(hashPassword("abcd4321", 4))

【问题讨论】:

  • reverse to lowercase/uppercase - 如果是这样,预期的输出不应该是EFGH7654

标签: javascript string hash caesar-cipher


【解决方案1】:

你的代码有很多问题。

这里的第一个问题不仅在于嵌套,还在于您使用var 关键字在外部函数范围内定义result 变量。然后你在不同的地方使用(读/写)那个变量。

  1. 在函数shift() 中(也在return 语句中)
  2. 在外部函数中(也在return 语句中)

您必须了解的是,您每次都引用 same 变量result。为确保您的变量是作用域的,即仅在块内有效(if 语句、function 正文等),您应该使用 letconst 关键字。这使您的代码更加安全。

第二个问题是您对数据类型所做的一些假设。如果你有一个字符串let s = "my string 123",那么对于s 中的每个x,表达式typeof s[x] === 'string' 将是true

另一个问题是算法本身。外部函数hashPassword() 遍历输入字符串的所有字符。在该循环中,您调用函数shift(password[i], x),传递一个字符。 shift() 的第一个参数称为text - 还有另一个for 循环(令人困惑且没有意义)。

为了简短起见,请看一下这个简化版:

function shift(char, x) {
    let result;
    
    const code = char.charCodeAt(0);
    if (code >= 65 && code < 91) {
      result = String.fromCharCode((code + x - 65) % 26 + 65);
    }
    else if (code >= 48 && code <= 57) {
      result = String.fromCharCode((code + x - 48) % 10 + 48);
    }
    else {
      result = String.fromCharCode((code + x - 97) % 26 + 97);
    }
    
    return result;
}

function reverseCase(character) {
  if (character === character.toLowerCase()) {
    return character.toUpperCase();
  } 
  else {
    return character.toLowerCase();
  }
}

function hashPassword(password, x) {
  let result = "";
  for (let i = 0; i < password.length; i++) {
    const char = shift(password[i], x);
    result += reverseCase(char);
  }
  return result;
}

console.log(hashPassword("abcd4321", 4)); // Output: EFGH8765

【讨论】:

    猜你喜欢
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 2014-03-07
    相关资源
    最近更新 更多