Python decrypter. IndexError: string index out of range

Python decrypter. IndexError: string index out of range

我一直在学校学习 python,我决定完成一项制作解密器的任务,但不是输入消息更改的数量,它会执行每一个并寻找常用词并选择最有可能的解密。如果这不是您想要的,那么他们可以查看每一个。但是,我在获取每个金额的解密代码时遇到了问题。这是代码的一部分奇数 return 之后的错误 returned:IndexError: string index out of range。我不明白为什么它不起作用。这是我知道的唯一编程语言,所以它可能很明显,但我只是不明白。我一直无法在网上找到答案,所以如果有人找到解决方案,我将不胜感激。提前致谢。

import sys
import time
from time import sleep as s
import random
import collections

LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ'
LETTERS = LETTERS.lower()

global c1, message

c1=int(0)

message = input("Enter the thing you want to decrypt. ")

def decrypt():
    global c1, LETTERS, message
    decrypted = ''
    for counter in range(1,27):
        for chars in message:
            if chars in LETTERS:
                c1 = int(c1+counter)
                num = LETTERS.find(chars)
                num -= c1
                decrypted +=  LETTERS[num]
                s(1)

        print(decrypted)

decrypt()

完整错误:

Enter the thing you want to decrypt. ij
hh
hhed
hhedzx
hhedzxsp
hhedzxspjf
hhedzxspjfyt
hhedzxspjfytlf
Traceback (most recent call last):
  File "C:\Users\TomHu\Documents\Documents\Tom\School\Homework\Year 8\Computing\Python\Encrypter.py", line 30, in <module>
    decrypt()
  File "C:\Users\TomHu\Documents\Documents\Tom\School\Homework\Year 8\Computing\Python\Encrypter.py", line 25, in decrypt
    decrypted +=  LETTERS[num]
IndexError: string index out of range

在您的示例中,LETTERS 的长度为 52。
可以与 LETTERS (num) 一起使用的索引必须介于 -52 和 51 之间。但是,对于您的示例,num 在错误之前等于 -56。
decrypted += LETTERS[num]前加上print(num)即可看到。
如果你想避免这个问题,你可以做一个 modulo len(LETTERS):

import sys
import time
from time import sleep as s
import random
import collections

LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ'
LETTERS = LETTERS.lower()
length=len(LETTERS)

global c1, message

c1=int(0)

message = input("Enter the thing you want to decrypt. ")

def decrypt():
    global c1, LETTERS, message
    decrypted = ''
    for counter in range(1,27):
        for chars in message:
            if chars in LETTERS:
                c1 = int(c1+counter)
                num = LETTERS.find(chars)
                num -= c1
                num=num%length
                decrypted +=  LETTERS[num]
                s(1)

        print(decrypted)

decrypt()  

通过此修改,您一定会始终提供有效的索引。之后您可以自由修改算法以获得您期望的输出。