新手开发者求助:如何实现字母转序号加密的解密逻辑?
问题描述
我是编程新手,已经写出了一段简单的加密代码(如下),可以把输入文本里的字母转换成它在字母表中的对应序号(比如a=1、b=2……z=26)。现在我想实现对应的解密功能,但遇到了难题:单个数字(1-9)对应a-i,两位数字(10-26)对应j-z,我不知道怎么让程序正确区分这些数字对应的字母,求帮忙解决。
原始加密代码
<html> <head> <title>TODO supply a title</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <div> <fieldset id = 'bonobo_fieldset'> <label>Text eingeben:</label> <textarea id='input'></textarea><br> <button type="button" id="btn">Text verschlüsseln</button><br> <br> <p id='text'></p> <script> var fieldset = document.getElementById('bonobo_fieldset'); var h4 = document.createElement('h4'); h4.innerHTML = ''; h4.textContent = ''; fieldset.appendChild(h4); var btn = document.getElementById('btn'); btn.addEventListener('click', verschlüsseln); var p_text = document.getElementById('text'); var Arr = new Array( ['a', 1], ['b', 2], ['c', 3], ['d', 4], ['e', 5], ['f', 6], ['g', 7], ['h', 8], ['i', 9], ['j', 10], ['k', 11], ['l', 12], ['m', 13], ['n', 14], ['o', 15], ['p', 16], ['q', 17], ['r', 18], ['s', 19], ['t', 20], ['u', 21], ['v', 22], ['w', 23], ['x', 24], ['y', 25], ['z', 26] ); function verschlüsseln() { var input = document.getElementById('input').value; input = input.toLowerCase() // 补全原代码缺失的执行括号 var rex = /[A-z]/; // 修正原代码replace替换所有匹配项的问题,改成逐个字符处理 let result = ''; for (let i = 0; i < input.length; i++) { const char = input.charAt(i); if (rex.test(char)) { const pair = Arr.find(item => item[0] === char); result += pair[1]; } else { result += char; } } document.getElementById('text').textContent = result; } </script> </fieldset> </div> </body> </html>
解密功能实现方案
核心思路:解密时优先识别10-26之间的两位数(对应j-z),剩下的单数字(1-9)对应a-i。可以从左往右遍历字符串,遇到数字时先尝试取当前位和下一位组成两位数,判断是否在合法范围内,是就转成对应字母并跳过下一位;不是就单独处理当前单数字。
修改后的完整代码
<html> <head> <title>字母数字互转加密解密</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <div> <fieldset id='bonobo_fieldset'> <label>输入文本:</label> <textarea id='input' rows="5" cols="50"></textarea><br> <button type="button" id="btn-encrypt">加密</button> <button type="button" id="btn-decrypt">解密</button><br> <br> <p id='result'>结果将显示在这里</p> </fieldset> </div> <script> const resultEl = document.getElementById('result'); // 优化映射关系,用对象实现双向查找更高效 const charToNum = { 'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6, 'g':7, 'h':8, 'i':9, 'j':10, 'k':11, 'l':12, 'm':13, 'n':14, 'o':15, 'p':16, 'q':17, 'r':18, 's':19, 't':20, 'u':21, 'v':22, 'w':23, 'x':24, 'y':25, 'z':26 }; const numToChar = Object.fromEntries( Object.entries(charToNum).map(([char, num]) => [num.toString(), char]) ); // 优化后的加密函数 function encrypt() { const input = document.getElementById('input').value.toLowerCase(); let result = ''; for (const char of input) { result += charToNum[char] || char; } resultEl.textContent = result; } // 解密函数 function decrypt() { const input = document.getElementById('input').value; let result = ''; let i = 0; while (i < input.length) { const currentChar = input[i]; if (!isNaN(currentChar)) { // 先尝试匹配两位数 if (i + 1 < input.length) { const twoDigit = input.slice(i, i+2); if (numToChar[twoDigit]) { result += numToChar[twoDigit]; i += 2; continue; } } // 匹配单数字或不合法数字 result += numToChar[currentChar] || currentChar; i += 1; } else { // 非数字直接保留 result += currentChar; i += 1; } } resultEl.textContent = result; } // 绑定按钮事件 document.getElementById('btn-encrypt').addEventListener('click', encrypt); document.getElementById('btn-decrypt').addEventListener('click', decrypt); </script> </body> </html>
关键说明
- 映射优化:用
charToNum和numToChar两个对象替代原数组,不管加密还是解密,查找对应值都更直接高效。 - 加密逻辑修正:解决了原代码中
replace会批量替换字符的问题,改成逐个字符处理,保留非字母内容的格式。 - 解密核心逻辑:
- 用
while循环控制遍历位置,方便处理两位数时跳过下一位 - 优先尝试组合两位数,判断是否在10-26范围内,合法就转对应字母
- 不合法的两位数或单数字,要么转对应字母,要么直接保留原字符
- 非数字内容完全保留,不破坏输入的原有格式
- 用
内容的提问来源于stack exchange,提问作者Sascha Fischer
相关产品推荐
相关产品推荐

