你得到TypeError
例外,因为x
在s[x]=ord(s[x])
语句中的值是s
列表的元素之一,所以这是从传递给encrypt()
字符串参数的个性。为了解决这个问题,只是遍历s
列表,它恰好是相同长度的原始字符串的所有可能的指标:
def encrypt(s):
lenStr=len(s)
s=list(s) # convert the string to a list
for i in range(lenStr):
s[i]=ord(s[i])
s[i]=chr(s[i])
这将使你的代码没有得到该错误运行。根据您要实现的加密算法的描述,需要注意的一件事是在0-255范围内生成非法的8位字符值。只需将mod运算符%
应用于中间结果以将值保持在适当的范围内即可避免该问题。这就是我的意思是:
def encrypt(s):
lenStr = len(s)
s = list(s) # convert the string to a list
for i in range(lenStr):
s[i] = chr((ord(s[i]) + lenStr) % 256)
return ''.join(s) # convert list back into a string
同样,你必须做同样的事情,当你解密的字符串:
def decrypt(s):
lenStr = len(s)
s = list(s) # convert the string to a list
for i in range(lenStr):
s[i] = chr((ord(s[i]) - lenStr) % 256)
return ''.join(s) # convert list back into a string
enc = encrypt('Gnomorian')
print('encrypted:', enc)
dec = decrypt(enc)
print('decrypted:', dec)
输出:
encrypted: Pwxvx{rjw
decrypted: Gnomorian
另外请注意,并非所有的ord()
值在0-255范围内的字符是可打印的,所以如果这是一个要求(即加密版本是printabl),您可能希望更加限制加密转换E)。
谢谢,你也解决了我以后用%256碰到的问题,也许即时格式化它错了,但是当我输入文件中的行:print(lines)even tho there是只有一行与“你好世界”,这就是我想加密它打印它的空间两次,当我用它上面的固定代码加密打印:你好世界 SZwazd}澳@martineau – Gnomorian
很难说什么可能导致这样的双重打印...也许你没有返回你的版本中的加密值。无论如何,如果你认为我的答案是值得的,请考虑对它进行投票。谢谢。 – martineau
我还没有声望做到这一点,但当我生病回来这样做 – Gnomorian