Python3自定义解码
当我将代码从python2迁移到python3时,我的代码并没有产生期望的结果,而是生成了错误:代码片段和错误日志,如下所示Python3自定义解码,python,python-3.x,Python,Python 3.x,当我将代码从python2迁移到python3时,我的代码并没有产生期望的结果,而是生成了错误:代码片段和错误日志,如下所示 import os import sys import base64 def decode(key, enc): dec = [] enc = base64.urlsafe_b64decode(enc) print(enc) for i in range(len(enc)): key_c = key[i % len(key)
import os
import sys
import base64
def decode(key, enc):
dec = []
enc = base64.urlsafe_b64decode(enc)
print(enc)
for i in range(len(enc)):
key_c = key[i % len(key)]
print(key_c)
dec_c = chr((256 + ord(enc[i]) - ord(key_c)) % 256)
print(dec_c)
dec.append(dec_c)
return "".join(dec)
contents = "p6KisaignLOinZqgmqKin6OT0uTZ0tSTlaKmpI+klJ+loI"
decodedLicense = decode('crab',contents)
错误日志:
File "s.py", line 16, in decode
dec_c = chr((256 + ord(enc[i]) - ord(key_c)) % 256)
TypeError: ord() expected string of length 1, but int found
我不知道最终结果是否正确,因为您没有指出问题中的期望或预期输出是什么,这使得很难确定 无论如何,正如我在一篇评论中所说,最初我收到一个不同的错误,抱怨
内容的长度有不正确的填充
,所以我做的第一件事就是添加一些东西来修复它。之后我开始得到TypeError:ord()期望的字符串长度为1,但int发现了您在问题中提到的异常
通过使用直接返回的base64.urlsafe\u b64decode()
字节,而不是尝试获取它们的ord()
,可以解决这个问题
下面的代码包含这些更改,至少可以运行…:
import os
import sys
import base64
def decode(key, enc):
dec = []
enc = base64.urlsafe_b64decode(enc).decode('latin1')
for i in range(len(enc)):
key_c = key[i % len(key)]
dec_c = chr((256 + enc[i] - ord(key_c)) % 256) # ord(enc[i]) -> enc[i]
dec.append(dec_c)
return "".join(dec)
contents = "p6KisaignLOinZqgmqKin6OT0uTZ0tSTlaKmpI+klJ+loI" # 46 chars
# Pad contents so its length is a multiple of 3 and it's valid Base64 data.
contents = contents + {0: '', 1: '==', 2: '='}[len(contents) % 3]
decodedLicense = decode('crab', contents)
print(decodedLicense) # -> D0AOE.;Q?+9>70A=@!q?v`s120EB,23=B.
使用print()
和print(type())
检查enc[i]
和key\u c
中的值,然后再在ord()
中使用它。哦,天哪,你为什么要自己实现加密?!?为了安全起见,使用图书馆!Python2将解码文本处理为字符串,但Python3将其处理为字节/数字-检查print(enc[i],type(enc[i])
i从enc=base64.urlsafe\u b64decode(enc)
->binascii.错误:填充不正确(在文件“C:\Python3\lib\base64.py”中),第87行,在B64解码中。这听起来像是您为内容设置的值无效。不知道是否有帮助,但是urlsafe\u b64decode()
函数的中有一些注释,描述了可能导致binascii.Error
填充异常的条件。