2012-11-17 14 views
11

Il codec esadecimale è stato escluso da python 3.3? Quando scrivo il codicepython encode()

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

Che cosa significa? Conosco binascii.hexlify() ma il metodo .encode() è bello! Qualche suggerimento?

+2

c'è http://bugs.python.org/issue7475 – jfs

+1

SO, manca il codice 'hex'! C'è un modo per aggiungere quel codec o un metodo, ci sono due file sul tuo link, che cosa fa? – iMagur

+0

Per convertire ** numeri ** in esadecimale, puoi comunque usare 'hex (n)'. – JeromeJ

risposta

24

No, usare encode() per esagire non è bello.

Il modo in cui si utilizza il codec hex ha funzionato in Python 2 perché è possibile chiamare encode() su stringhe a 8 bit in Python 2, ovvero è possibile codificare qualcosa che è già codificato. Non ha senso. encode() è per la codifica di stringhe Unicode in stringhe a 8 bit, non per codificare stringhe a 8 bit come stringhe a 8 bit.

In Python 3 non è più possibile chiamare encode() su stringhe a 8 bit, quindi il codec hex è diventato inutile ed è stato rimosso.

Anche se in teoria potrebbe avere un codec hex e usarlo in questo modo:

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

Utilizzando binascii è più facile e più bello:

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

binascii.hexlify() richiede un'interfaccia buffer, giusto? Quindi, qualcuno può spiegarmi come eseguire la formattazione sull'interfaccia del buffer? – iMagur

+0

@iMagur: Scusa, ho dimenticato di creare il codice Python 3, dal momento che l'ho realizzato in Python 2 (poiché hex_codec non esiste in Python 3). Questo è stato risolto. Il suddetto codice binascii funziona in Python 3 e mostra come farlo. In Python 3 le stringhe sono Unicode, quindi non possono essere esacrite direttamente, è necessario prima codificarle come 'bytes'. –

+0

Questo è buono perché francamente c'è un sacco di utilizzo di 8 bit in corso là fuori. In particolare tra ('ascii'), ('IBM500'), ('IBM037'). Ciò che era veramente necessario fuori dalla scatola era un numero di metodi esadecimali in stile "OD" per le stringhe. Python viene scelto per ridurre lo sforzo e queste cose raddoppiano il codice richiesto .. Sì, so che IBM500 è unicode .. – mckenzm

0

questa è la stessa risposta per quanto sopra, ma ho modificato funziona così con 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("")