Python encode()

Из шестнадцатеричного кодека исключен из python 3.3? Когда я пишу код

>>> s="Hallo"
>>> s.encode('hex')
Traceback (most recent call last):
  File "<pyshell#24>", line 1, in <module>
    s.encode('hex')
LookupError: unknown encoding: hex

Что это значит? Я знаю о binascii.hexlify(), но метод .encode() хорош! Любое предложение?

Ответ 1

Нет, использование encode() для hexlify не является приятным.

Как вы используете кодек hex, который работал в Python 2, потому что вы можете вызывать encode() для 8-битных строк в Python 2, то есть вы можете кодировать то, что уже закодировано. Это не имеет смысла. encode() предназначен для кодирования строк Unicode в 8-битные строки, а не для кодирования 8-битных строк в виде 8-битовых строк.

В Python 3 вы больше не можете вызывать encode() в 8-битных строках, поэтому кодек hex стал бессмысленным и был удален.

Хотя теоретически вы можете иметь кодек hex и использовать его так:

>>> import codecs
>>> hexlify = codecs.getencoder('hex')
>>> hexlify(b'Blaah')[0]
b'426c616168'

Использование binascii проще и приятнее:

>>> import binascii
>>> binascii.hexlify(b'Blaah')
b'426c616168'

Ответ 2

это тот же ответ для выше, но я его модифицировал, поэтому он работает с python 3.

import binascii
from Crypto.Cipher import AES
from Crypto import Random

def encrypt(passwrd, message):
    msglist = []
    key = bytes(passwrd, "utf-8")
    iv = Random.new().read(AES.block_size)
    cipher = AES.new(key, AES.MODE_CFB, iv)
    msg = iv + cipher.encrypt(bytes(message, "utf-8"))
    msg = binascii.hexlify(msg)
    for letter in str(msg):
        msglist.append(letter)
    msglist.remove("b")
    msglist.remove("'")
    msglist.remove("'")
    for letter in msglist:
        print(letter, end="")
    print("")

def decrypt(passwrd, message):
    msglist = []
    key = bytes(passwrd, "utf-8")
    iv = Random.new().read(AES.block_size)
    cipher = AES.new(key, AES.MODE_CFB, iv)
    msg = cipher.decrypt(binascii.unhexlify(bytes(message, "utf-8")))[len(iv):]
    for letter in str(msg):
        msglist.append(letter)
    msglist.remove("b")
    msglist.remove("'")
    msglist.remove("'")
    for letter in msglist:
        print(letter, end="")
    print("")