凯撒密码(Caesar Cipher)加密程序索引越界错误排查求助
问题分析与修复方案
嘿,我看到你的凯撒密码变种代码遇到了索引越界的问题,咱们来一步步理清楚哪里出问题了。
核心错误原因
你的字符集characters总共有92个字符(索引范围是0到91)。当你用偏移量70的时候,假设某个字符的索引是22,22 + 70 = 92——这明显超出了最大索引91,自然就会抛出String_Index_Out_Of_Range错误。
你尝试用while key > limit: key -= limit来简化偏移量,但这个逻辑有漏洞:即使key小于limit,字符索引加上key之后依然可能超过字符集的长度上限。而且解密时如果索引减去key得到负数,直接用负数索引会得到不符合预期的结果(虽然Python允许负数索引,但这和凯撒密码的解密逻辑不符)。
修复方案
解决这个问题的关键是用取模运算来处理偏移量和索引计算,因为偏移limit位相当于没有偏移,取模能自动把数值约束在有效范围内。
修改后的代码如下:
characters = '`1234567890-=qwertyuiopasdfghjklzxcvbnm,./~!@#$%^&*()_+|\\{}[]:;"\'QWERTYUIOPASDFGHJKLZXCVBNM' key_raw = 70 # 之前报错的偏移量 def encode(text, key): output, text = '', str(text) limit = len(characters) key = key % limit # 用取模简化偏移量,替代while循环 for i in text: if i in characters: idx = characters.index(i) output += characters[(idx + key) % limit] # 取模确保索引不越界 else: output += i return output def decode(text, key): output, text = '', str(text) limit = len(characters) key = key % limit for i in text: if i in characters: idx = characters.index(i) output += characters[(idx - key) % limit] # 处理负数索引,保证解密逻辑正确 else: output += i return output # 测试加密解密一致性 test_text = 'Why do I get String_Index_Out_Of_Range?' encoded_result = encode(test_text, key_raw) decoded_result = decode(encoded_result, key_raw) print(f"原文本: {test_text}") print(f"解密后文本: {decoded_result}") print(f"加密解密是否一致: {test_text == decoded_result}")
关键修改点解释
- 偏移量简化:用
key = key % limit替代while循环,不管key是多大的正数或负数,都会被转化为0到limit-1之间的有效偏移量,逻辑更简洁可靠。 - 加密索引计算:
(idx + key) % limit确保相加后的索引不会超出字符集范围,比如92 % 92 = 0,会自动回到第一个字符的位置。 - 解密索引计算:
(idx - key) % limit处理了索引为负数的情况,比如(5 - 10) % 92 = 87,会正确映射到字符集里对应的解密字符,避免了负数索引带来的逻辑错误。
这样修改后,不管你用多大的偏移量(比如70、100、甚至负数),代码都能正常运行,而且加密再解密的结果会和原文本完全一致。
内容的提问来源于stack exchange,提问作者Aaryan Gamer
相关产品推荐
相关产品推荐

