我正在尝试在JavaScript中编写一个简单的解密函数,该函数将获取输入字符串并通过ASCII中的字母表来查找代码的所有26种变体。我知道如何进行正常的解密,但它只迭代一次,只给出一个变体而不是全部26.如何更改?
var count = 0;
function inputData(buttonPress)
{
var stringData = document.getElementById("stringData").value;
var splitStr = stringData.toLowerCase();
var sendStr = (splitStr).split("");
shift= 26;
decrypt(sendStr, shift);
}
function decrypt(newStr, shift)
{
if(count < newStr.length)
{
var strAscii = newStr[count].charCodeAt(0);
strAscii=parseInt(strAscii);
var newStrAscii= ((strAscii -97 -shift) % 26) + 97;
newStr[count] = String.fromCharCode(newStrAscii);
count++;
decrypt(newString,shift-1);
}
newStr= newStr.join("");
alert(newStr);
}
答案 0 :(得分:2)
我将假设你只有ROT13的功能。如果它只是字母偏移的+1,你可以使用for循环,每次你取出你以前的输出并一次又一次地传递它。
这是我能想到的最简单,最优雅的方式来编写代码:
var alphabet = 'abcdefghijklmnopqrstuvwxyz'.split('')
function nextLetter(letter) {
var index = alphabet.indexOf(letter)
return alphabet[(index+1) % 26]
}
function caesarShiftBy1(text) {
return text.split('').map(nextLetter).join('')
}
function allCaesarShifts(text) {
var temp = text.toLowerCase();
for (var i=0; i<26; i++) {
console.log(temp);
temp = caesarShiftBy1(temp);
}
}
导致:
allCaesarShifts('abcdefghijklmnopqrstuvwxyz')
abcdefghijklmnopqrstuvwxyz
bcdefghijklmnopqrstuvwxyza
cdefghijklmnopqrstuvwxyzab
defghijklmnopqrstuvwxyzabc
efghijklmnopqrstuvwxyzabcd
fghijklmnopqrstuvwxyzabcde
ghijklmnopqrstuvwxyzabcdef
hijklmnopqrstuvwxyzabcdefg
ijklmnopqrstuvwxyzabcdefgh
jklmnopqrstuvwxyzabcdefghi
klmnopqrstuvwxyzabcdefghij
lmnopqrstuvwxyzabcdefghijk
mnopqrstuvwxyzabcdefghijkl
nopqrstuvwxyzabcdefghijklm
opqrstuvwxyzabcdefghijklmn
pqrstuvwxyzabcdefghijklmno
qrstuvwxyzabcdefghijklmnop
rstuvwxyzabcdefghijklmnopq
stuvwxyzabcdefghijklmnopqr
tuvwxyzabcdefghijklmnopqrs
uvwxyzabcdefghijklmnopqrst
vwxyzabcdefghijklmnopqrstu
wxyzabcdefghijklmnopqrstuv
xyzabcdefghijklmnopqrstuvw
yzabcdefghijklmnopqrstuvwx
zabcdefghijklmnopqrstuvwxy
编辑:现在按请求递归:
function allCaesarShifts(text) {
var toReturn = [];
function helper(text, offset) {
toReturn +=[ caesarShift(text,offset) ];
if (offset>0)
helper(text, offset-1);
}
helper(text, 26);
return toReturn;
}
更优雅的是使函数shiftLetter(letter,offset = 1),caesarShiftBy(text,offset = 1),然后在范围1,2上映射caesarShifyBy(text = text,N)的curried版本,... 26(但没有jquery的javascript对于这个东西没有很好的原语)。
答案 1 :(得分:0)
要将字符串中的所有数字字符实体转换为其等效字符,您可以执行以下操作:
str.replace(/&amp;#(\ d +); / g,function(m,n){return String.fromCharCode(n);})