javascript - javascript中的凯撒密码技术和反向大小写
问题描述
我是初学者,想制作自己的功能。我想通过将每个字符移动给定 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))
解决方案
您的代码中存在相当多的问题。
这里的第一个问题不仅是嵌套,还在于您使用关键字result
在外部函数范围内定义变量。var
然后你在不同的地方使用(读/写)那个变量。
- 在函数
shift()
中(也在return
语句中) - 在外部函数中(也在
return
语句中)
您必须了解的是,您每次都指的是同一个变量。result
为确保您的变量有作用域,即仅在块(if
语句、function
正文等)内有效,您应该使用let
orconst
关键字。这使您的代码更安全。
第二个问题是您对数据类型所做的一些假设。如果您有一个字符串let s = "my string 123"
,则表达式typeof s[x] === 'string'
将true
适用于每个x
in s
。
另一个问题是算法本身。外部函数hashPassword()
遍历输入字符串的所有字符。在该循环中,您调用 function 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
推荐阅读
- extjs - 字段工具提示与 Extjs 中的 allow blank=false 消息重叠
- c# - ajax调用后重定向
- android - Android 12 API 31,应用程序启动时的奇怪行为,看到全屏居中的启动器图标而不是飞溅
- c++ - 增加订单搜索树 - 在我的解决方案中找不到错误
- javascript - Axios 请求拦截器 - 标头值未根据状态值更新
- html - 表单标签不包含 innerHTML
- dax - 尝试使用 PBI / DAX 统计一个周期内进行的任务
- python - 用于在网格数据图中提取数据的 python 函数
- r - 在R中按顺序搜索字符串
- netlogo - 如何使用 NetLogo 使满足条件的海龟移动