web-dev-qa-db-fra.com

python encode ()

Le codec hexadécimal a-t-il été exclu de python 3.3? Quand j'écris le code

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

Qu'est-ce que ça veut dire? Je connais binascii.hexlify () mais la méthode .encode () est quand même bien! Toute suggestion?

17
iMagur

Non, utiliser encode() pour hexlify n'est pas agréable.

La façon dont vous utilisez le codec hex a fonctionné dans Python 2 car vous pouvez appeler encode() sur des chaînes de 8 bits dans Python 2, c'est-à-dire que vous pouvez coder quelque chose qui est déjà encodé. Cela n'a aucun sens. encode() sert à coder des chaînes Unicode en chaînes de 8 bits, pas à coder des chaînes de 8 bits en chaînes de 8 bits.

Dans Python 3, vous ne pouvez plus appeler encode() sur des chaînes de 8 bits, donc le codec hex est devenu inutile et a été supprimé.

Bien que vous puissiez théoriquement avoir un codec hex et l'utiliser comme ceci:

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

L'utilisation de binascii est plus facile et plus agréable:

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

c'est la même réponse pour ce qui précède mais je l'ai modifié pour qu'il fonctionne avec 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("")
1
king_quiksc0pe