Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3自定义解码_Python_Python 3.x - Fatal编程技术网

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)

当我将代码从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)]
        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
填充异常的条件。