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

Python消息编解码项目解码报错:IndexError: string index out of range

消息编解码项目解码报错排查与修复

报错信息

执行解码操作时触发以下错误:

IndexError: string index out of range

错误出现在代码行:d2 = d1[-1] + d1[:-1]

错误原因

  1. 解码与编码逻辑不匹配:
    编码时仅对长度>3的单词执行「移位+添加r1/r2前后缀」操作,短单词(长度≤3)仅做反转。但解码时判断条件为len(word1)>=3,导致编码后的短单词(长度仍为3)错误进入长单词解码流程,执行word1[3:-3]得到空字符串d1,访问d1[-1]时触发索引越界。
  2. 未校验r1/r2输入长度:
    编码阶段要求输入3位随机值,但未做长度校验,若用户输入非3位字符,会导致编码后的单词结构异常,解码时word1[3:-3]截取得到空字符串或无效内容。
  3. 解码阶段未复用编码时的r1/r2:
    原解码代码直接硬编码截取[3:-3],但r1/r2是用户自定义的3位值,解码时必须复用相同的r1/r2才能正确截取有效内容,否则会导致d1为空或错误。
  4. 冗余代码引发潜在问题:
    代码中d2变量未实际使用,属于冗余代码,且dr的赋值与d2重复,无意义。

解决方案

1. 编码阶段:添加r1/r2长度校验

确保用户输入的r1和r2严格为3位,避免后续编码结构异常。

2. 解码阶段:匹配编码逻辑的判断条件

仅对长度>9的单词(编码后长度=3+原单词长度+3,原单词>3则编码后长度>9)执行长单词解码流程,同时必须让用户输入编码时使用的r1/r2。

3. 增加格式校验

解码时验证单词是否以r1开头、以r2结尾,避免错误解码非编码内容。

4. 清理冗余代码

删除未使用的d2变量。

修改后的完整代码

print("STARTED")
inpmsg = input("input your message : ")
simpmsg = inpmsg.split(" ")

inpEnDe = input("DO YOU WANT TO START ENCODE OR DECODE")
encoderlst = []

if inpEnDe.lower() == "encode":
    # 校验r1长度必须为3
    r1 = input("input 3 random values: ")
    while len(r1) != 3:
        r1 = input("请输入正好3个字符: ")
    # 校验r2长度必须为3
    r2 = input("again input 3 random values: ")
    while len(r2) != 3:
        r2 = input("请输入正好3个字符: ")
    
    for word in simpmsg:
        if len(word) > 3:
            e1 = word[1:] + word[0]
            e2 = r1 + e1 + r2
            encoderlst.append(e2)
        else:
            encoderlst.append(word[::-1])
    print(" ".join(encoderlst))
else:
    # 解码时获取编码用的r1和r2,且校验长度
    r1_decode = input("输入编码时使用的第一个3位随机值: ")
    while len(r1_decode) != 3:
        r1_decode = input("请输入正好3个字符: ")
    r2_decode = input("输入编码时使用的第二个3位随机值: ")
    while len(r2_decode) != 3:
        r2_decode = input("请输入正好3个字符: ")
    
    nwords = []
    for word1 in simpmsg:
        # 编码后长单词长度=3+原单词长度+3,原单词>3则长度>9
        if len(word1) > 9:
            # 验证格式是否匹配编码规则
            if word1.startswith(r1_decode) and word1.endswith(r2_decode):
                d1 = word1[len(r1_decode):-len(r2_decode)]
                if d1:
                    # 还原移位操作
                    dr = d1[-1] + d1[:-1]
                    nwords.append(dr)
                else:
                    nwords.append(word1)
            else:
                # 不符合编码格式,按短单词处理
                nwords.append(word1[::-1])
        else:
            # 短单词直接反转还原
            nwords.append(word1[::-1])
    print(" ".join(nwords))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:47:55