这是我从https://inventwithpython.com/hacking
获得的源代码import math, pyperclip
def main():
myMessage = 'Cenoonommstmme oo snnio. s s c'
myKey = 8
plaintext = decryptMessage(myKey, myMessage)
print(plaintext + '|')
pyperclip.copy(plaintext)
def decryptMessage(key, message):
numOfColumns = math.ceil(len(message) / key)
numOfRows = key
numOfShadedBoxes = (numOfColumns * numOfRows) - len(message)
plaintext = [''] * int(numOfColumns)
col = 0
row = 0
for symbol in message:
plaintext[col] += symbol
col += 1
if (col == numOfColumns) or (col == numOfColumns - 1 and row >= numOfRows - numOfShadedBoxes):
col = 0
row += 1
return ''.join(plaintext)
if __name__ == '__main__':
main()
这应该归还的是
Common sence is not so common.|
我回来的是什么
Coosmosi seomteonos nnmm n. c|
我无法弄清楚代码无法发回短语
的位置答案 0 :(得分:0)
代码没问题。问题是你使用的是错误版本的Python。正如该网站的“安装”章节所说:
重要提示!一定要安装Python 3,而不是Python 2 本书中的程序使用Python 3,如果你尝试,你会得到错误 用Python 2运行它。这非常重要,我正在添加一个卡通片 企鹅告诉你安装Python 3,这样你就不会错过这个 消息:
您正在使用Python 2来运行该程序。
结果不正确,因为程序依赖于Python 2中的行为与Python 3不同的特性。具体来说,在Python 3中划分两个整数会产生浮点结果,但在Python 2中它会生成一个向下舍入的整数结果。所以这个表达式:
(len(消息)/密钥)
在Python 3中产生3.75但在Python 2中产生3,因此表达式为:
math.ceil(len(message)/ key)
在Python 3中生成4(3.75向上舍入为4),但在Python 2中生成3(3向上舍入为3)。这意味着您的numOfColumns
不正确,因此解密过程会产生不正确的结果。
您可以通过将(len(message) / key)
更改为(float(len(message)) / key)
来强制解决此问题,以强制Python 2将该计算视为可提供所需3.75结果的浮点除法。但真正的解决方案是切换到使用Python 3,因为Python 3和Python 2之间的行为差异只会在本书的其余部分继续造成麻烦。