You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

新手开发者求助:如何实现字母转序号加密的解密逻辑?

问题描述

我是编程新手,已经写出了一段简单的加密代码(如下),可以把输入文本里的字母转换成它在字母表中的对应序号(比如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>

关键说明

  1. 映射优化:用charToNum和numToChar两个对象替代原数组,不管加密还是解密,查找对应值都更直接高效。
  2. 加密逻辑修正:解决了原代码中replace会批量替换字符的问题,改成逐个字符处理,保留非字母内容的格式。
  3. 解密核心逻辑:
    • 用while循环控制遍历位置,方便处理两位数时跳过下一位
    • 优先尝试组合两位数,判断是否在10-26范围内,合法就转对应字母
    • 不合法的两位数或单数字,要么转对应字母,要么直接保留原字符
    • 非数字内容完全保留,不破坏输入的原有格式

内容的提问来源于stack exchange,提问作者Sascha Fischer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 10:48:19