Python消息编解码项目解码报错:IndexError: string index out of range
消息编解码项目解码报错排查与修复
报错信息
执行解码操作时触发以下错误:
IndexError: string index out of range
错误出现在代码行:d2 = d1[-1] + d1[:-1]
错误原因
- 解码与编码逻辑不匹配:
编码时仅对长度>3的单词执行「移位+添加r1/r2前后缀」操作,短单词(长度≤3)仅做反转。但解码时判断条件为len(word1)>=3,导致编码后的短单词(长度仍为3)错误进入长单词解码流程,执行word1[3:-3]得到空字符串d1,访问d1[-1]时触发索引越界。 - 未校验r1/r2输入长度:
编码阶段要求输入3位随机值,但未做长度校验,若用户输入非3位字符,会导致编码后的单词结构异常,解码时word1[3:-3]截取得到空字符串或无效内容。 - 解码阶段未复用编码时的r1/r2:
原解码代码直接硬编码截取[3:-3],但r1/r2是用户自定义的3位值,解码时必须复用相同的r1/r2才能正确截取有效内容,否则会导致d1为空或错误。 - 冗余代码引发潜在问题:
代码中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
相关产品推荐
相关产品推荐

