自定义文本编码解码逻辑异常:解码hello编码结果未得到原文本
问题分析与解决
你的编码和解码逻辑的核心问题在于解码时使用了错误的索引值,没有对应上编码步骤中每个字符关联的原字符串索引。我们一步步拆解来看:
先还原编码过程(以hello为例)
编码逻辑的步骤是:
- 遍历原字符串的每个字符,索引
i从0到4(对应h,e,l,l,o) - 每个字符转成int后计算:
d = 原字符ASCII * 2 + i - 将计算后的字符依次加入
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(); }
验证效果
用编码结果âÛÚËÐ测试:
- 反转后得到
ÐËÚÛâ - 遍历每个字符:
Ð(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
相关产品推荐
相关产品推荐

