我需要保持相同的大小写,即“攻击”将是“ Lxfopv”,并带有键“柠檬”。此外,我需要保留消息中的所有空格以进行加密。
我使用了if语句来检查空格
if(text.charAt(i) == ' '){
continue;
但是它似乎没有任何作用。
function encrypt(text, key) {
var output= '';
var alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
for(var i = 0; i < text.length; i++){
var a= alphabet.indexOf(key.charAt(i % key.length));
var b= alphabet.indexOf(text.charAt(i));
if(text.charAt(i) == ' '){
continue;
}else{
output += alphabet.charAt((a+ b) % alphabet.length);
}
}
return output;
}
如果通过“黎明袭击”,我的期望输出应该是Lxfopv ef Rnhr
,但是我收到的是LxFopvmHOeIB
,键为“柠檬”。
如何解决此问题以获得所需的输出?我已经对字母进行硬编码了吗?
答案 0 :(得分:0)
只需在您的字母上添加空格:
if(text.charAt(i) == ' '){
output += " ";
}
答案 1 :(得分:0)
为了保留大小写,您必须对单个大小写进行转换。
仅在将其添加到输出时,才可以将其转换为正确的大小写。
并且为了获得与不忽略空格字符的其他算法相同的值,您必须使用第二个迭代器变量。
此迭代器仅应在有效输入上递增,并将用于迭代key
。
inp.oninput = e => log.textContent = encrypt(inp.value, 'lemon');
function encrypt(text, key) {
var output= '';
// single case dictionary
var alphabet = "abcdefghijklmnopqrstuvwxyz";
var low = text.toLowerCase(); // we'll work on this one
for(let i = 0, j = 0; i < text.length; i++){
// here we use `j` for the key
let a = alphabet.indexOf(key.charAt(j % key.length));
let b = alphabet.indexOf(low.charAt(i));
let out = ''; // the character we'll add
if(low.charAt(i) == ' '){
out = ' '; // keep spaces untouched
}else if(b > -1){ // only if valid
out = alphabet.charAt((a+ b) % alphabet.length); // get the ciphered value
j++; // only here we increment `j`
}
if(low[i] !== text[i]) { // if input and lower case are different
// that means that input was upper case
out = out.toUpperCase();
}
output += out;
}
return output;
}
<input id="inp"> <pre id="log"></pre>