在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 json.dumps 特殊数据类型的自定义序列化操作
Python3报错处理:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: o