字符串索引超出范围,Vigenere 密码
Posted
技术标签:
【中文标题】字符串索引超出范围,Vigenere 密码【英文标题】:String Index Out Of Range, Vigenere Cipher 【发布时间】:2015-09-23 23:13:29 【问题描述】:我正在努力实现 Vigenere Cipher。我收到了错误:
IndexError: 字符串超出范围
import sys
# Get the message and key
message = (sys.argv[1]).lower()
key = (sys.argv[2]).lower()
# Open file
f = open('Cipher.txt', 'w')
for i in range(len(message)):
if i > len(key):
j = i % len(key)
f.write(str(ord(message[i]) + ord(key[j]) % 26 + ord('a')))
else:
f.write(str(ord(message[i]) + ord(key[i]) % 26 + ord('a')))
f.close()
我将在f.write(str(ord(message[i]) + ord(key[i]) % 26 + ord('a')))
之后上线。我知道我的key
可能比message
的长度短,这就是为什么我在它前面打了一个检查。例如,如果我的密钥是 test
,并且我已经到达第 5 个字符,我将回到 test
中的 t
。
【问题讨论】:
【参考方案1】:如果是i == len(key)
,则返回值为i
。
替换
if i > len(key):
j = i % len(key)
f.write(str(ord(message[i]) + ord(key[j]) % 26 + ord('a')))
else:
f.write(str(ord(message[i]) + ord(key[i]) % 26 + ord('a')))
与:
a = ord('a')
...
j = i % (len(key) - 1)
f.write(str((ord(message[i])-a + ord(key[j])-a) % 26 + a))
【讨论】:
这对我没有任何作用。 有效,但给出了错误的 unicode 字符,我相信我现在可以简单地修改这些值。谢谢! 另一件需要注意的事情是%
模运算符与*
和/
具有相同的优先级,因此您可能想要这样:(ord(message[i]) + ord(key[j])) % 26
@MattBrzezinski 查看编辑。这也应该修复 unicode 字符以上是关于字符串索引超出范围,Vigenere 密码的主要内容,如果未能解决你的问题,请参考以下文章
这个 Vigenere 密码中的“字符串索引超出范围”是啥意思?