在python 3.6中处理自定义编码时遇到类型错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在python 3.6中处理自定义编码时遇到类型错误相关的知识,希望对你有一定的参考价值。

我写了一个自定义编码代码片段。当我在python 3.6上运行它时,我遇到了类型错误。我无法弄明白。代码片段与python 2.7一起正常工作。

import os
import sys
import base64

def encode(key, clear):
    """encode custom """
    enc = []
    for i in range(len(clear)):
        key_c = key[i % len(key)]
        enc_c = chr((ord(clear[i]) + ord(key_c)) % 256)
        #change the int or str
        enc.append(enc_c)
    return base64.urlsafe_b64encode("".join(enc))

clear = "ABCDEFGH"
encode_var = encode("crumbs", clear)

错误日志:

(py3) C:Devcrumbles>python s1.py
Traceback (most recent call last):
  File "s1.py", line 45, in <module>
    encode_var = encode("crumbs", clear)
  File "s1.py", line 42, in encode
    return base64.urlsafe_b64encode("".join(enc))
  File "C:UsersCookie1Anaconda3envspy3libase64.py", line 118, in urlsafe
_b64encode
    return b64encode(s).translate(_urlsafe_encode_translation)
  File "C:UsersCookie1Anaconda3envspy3libase64.py", line 58, in b64encod
e
    encoded = binascii.b2a_base64(s, newline=False)
TypeError: a bytes-like object is required, not 'str'
答案

您传入的是文本,而不是二进制bytes对象。 base64.urlsafe_b64encode()函数需要字节,而不是文本。

生成字节代替:

from itertools import cycle

def encode(key, clear):
    """encode custom """
    key, clear = cycle(key.encode()), clear.encode() 
    enc = bytes((c + k) % 256 for c, k in zip(clear, key))
    return base64.urlsafe_b64encode(enc)

我使用了一些迭代器技巧来产生bytes()接受的整数。

请注意,在创建单密钥加密时,使用XOR生成加密字节更为常见:

from operator import xor

key, clear = cycle(key.encode()), clear.encode() 
enc = bytes(map(xor, clear, key))

那是因为使用相同的键可以简单地颠倒XOR; clear XOR键产生加密文本,加密XOR键再次产生明文。

以上是关于在python 3.6中处理自定义编码时遇到类型错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 python 3.6 安装自定义构建 tensorflow 1.12 轮时出错

python交互环境中导入文件中自定义的函数报错

python3 json序列化问题

Python json.dumps 特殊数据类型的自定义序列化操作

Python3报错处理:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: o

python之旅:数据类型字符编码文件处理