我的 ROT13 JS 函数在大多数情况下工作正常,但有些字符就是出错,例如HELLO
带着U,R,Y,Y,
回来了.
有人可以向我解释我做错了什么吗?
P.s 我正在做免费的 CodeCamp Caesars 密码挑战赛。
function rot13(str) { // LBH QVQ VG!
var stringArray = str.split("");
var stringArray2 = [];
var stringArray3 = [];
for( var i in stringArray){
var y = stringArray[i].charCodeAt();
y += 13;
stringArray2.push(y);
}
for (var u in stringArray2){
var x = String.fromCharCode(stringArray2[u]);
stringArray3.push(x);
}
var transformed = stringArray3.join().toString();
return transformed;
}
// Change the inputs below to test
console.log(rot13("HELLO"));
我想为您提供 ROT13 函数的替代方案。
我提出的替代方案只是常规凯撒密码算法的一种特殊用法——一种非常简单的加密形式,其中原始消息中的每个字母都向左或向右移动一定数量的位置。
要解密消息,我们只需将字母移回相同数量的位置。
例:
- JAVASCRIPT 变成 MDYDVFULSW 如果我们将所有字母移动 3 个位置
- MDYDVFULSW 如果我们将所有字母后移 3 个位置,则会返回 JAVASCRIPT。
如果移动后一个字母超出了字母的范围,那么这个字母就会被字母包裹起来。示例:如果字母 Z 移动 3 个位置,则变为 C。
这种"环绕"效果意味着使用模数。用数学术语来说,以上可以表示为:
En(x) = (x + n) mod 26
Dn(x)= (x – n) mod 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;
}
还有其他实现模...如果您有兴趣,可以查阅本文。
通过使用上面定义的 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;
}
要使用 ROT13 进行编码...现在只需选择算法名称指示的适当键即可。
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.");