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

自定义文本编码解码逻辑异常:解码hello编码结果未得到原文本

问题分析与解决

你的编码和解码逻辑的核心问题在于解码时使用了错误的索引值,没有对应上编码步骤中每个字符关联的原字符串索引。我们一步步拆解来看:

先还原编码过程(以hello为例)

编码逻辑的步骤是:

  1. 遍历原字符串的每个字符,索引i从0到4(对应h,e,l,l,o)
  2. 每个字符转成int后计算:d = 原字符ASCII * 2 + i
  3. 将计算后的字符依次加入StringBuilder,最后反转整个Builder得到编码结果

对hello来说,计算过程是:

  • h(104): 104*2+0 = 208 → 字符Ð
  • e(101): 101*2+1 = 203 → 字符Ë
  • l(108): 108*2+2 = 218 → 字符Ú
  • l(108): 108*2+3 = 219 → 字符Û
  • o(111): 111*2+4 = 226 → 字符â
    Builder里的初始顺序是ÐËÚÛâ,反转后得到你看到的编码结果âÛÚËÐ。

你的解码逻辑哪里错了?

你解码时直接遍历编码字符串的索引(从4到0),并减去当前遍历的索引i,但这个i和编码时的原索引完全不匹配:

  • 编码后的第一个字符â对应原字符串的最后一个字符o(原索引4)
  • 编码后的最后一个字符Ð对应原字符串的第一个字符h(原索引0)

而你在解码Ð时,用了data = 208 - 4(因为此时i=4),得到204,除以2是102(对应f),这就是错误的根源——你应该减去的是原字符串的索引0,而不是解码时的遍历索引4。

正确的解码逻辑

要反转编码流程,需要先把编码后的字符串反转回编码时的Builder顺序,然后遍历这个反转后的字符串,此时每个位置的索引就是编码时的原索引,再做逆运算:

private static String decode(String input) {
    // 先反转编码后的字符串,回到编码时的字符顺序
    StringBuilder reversedInput = new StringBuilder(input).reverse();
    StringBuilder result = new StringBuilder();
    for (int i = 0; i < reversedInput.length(); i++) {
        char c = reversedInput.charAt(i);
        int data = (int) c;
        // 用编码时的原索引i做逆运算:data = (原ASCII*2) + i → 原ASCII = (data - i)/2
        data = data - i;
        data = data / 2;
        result.append((char) data);
    }
    return result.toString();
}

验证效果

用编码结果âÛÚËÐ测试:

  1. 反转后得到ÐËÚÛâ
  2. 遍历每个字符:
    • Ð(208): 208-0=208 → 208/2=104 → h
    • Ë(203):203-1=202 →202/2=101 →e
    • Ú(218):218-2=216 →216/2=108 →l
    • Û(219):219-3=216 →216/2=108 →l
    • â(226):226-4=222 →222/2=111 →o
      最终得到原字符串hello,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:53:53