2012-11-17 12 views
11

Czy kodek szesnastkowy został wykluczony z Pythona 3.3? Kiedy piszę kodkodowanie python()

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

Co to oznacza? Wiem o metodzie binascii.hexlify(), ale metoda .encode() jest niezła! Wszelkie sugestie?

+2

jest http://bugs.python.org/issue7475 – jfs

+1

Brak kodu "heksadecymalnego"! Czy jest jakiś sposób dodania tego kodeku lub metody, są dwa pliki na twoim łączu, co to robi? – iMagur

+0

Aby przekonwertować ** liczby ** w hex, nadal możesz użyć 'hex (n)'. – JeromeJ

Odpowiedz

24

Nie, używanie encode() do hexlify nie jest miłe.

Sposób korzystania z kodeka hex działał w języku Python 2, ponieważ można wywoływać encode() na 8-bitowych łańcuchach w Pythonie 2, tzn. Można zakodować coś, co jest już zakodowane. To nie ma sensu. encode() służy do kodowania ciągów Unicode w ciągi 8-bitowe, a nie do kodowania ciągów 8-bitowych jako ciągów 8-bitowych.

W języku Python 3 nie można już wywoływać encode() na ciągach 8-bitowych, więc kodek hex stał się bezcelowy i został usunięty.

Chociaż teoretycznie może mieć hex kodek i używać go tak:

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

Korzystanie binascii jest łatwiejsze i ładniejsze:

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

binascii.hexlify() potrzebujesz interfejsu bufora, prawda? Czy ktoś może mi wyjaśnić, jak wykonać formatowanie w interfejsie buforowym? – iMagur

+0

@iMagur: Przepraszam, zapomniałem napisać kod Python 3, odkąd zrobiłem to w Pythonie 2 (ponieważ hex_codec nie istnieje w Pythonie 3). To już zostało naprawione. Powyższy kod binascii działa w Pythonie 3 i pokazuje, jak to zrobić. W języku Python 3 ciągi są w kodzie Unicode, więc nie mogą być bezpośrednio udostępniane w sześcioboku, należy najpierw zakodować je jako "bajtów". –

+0

To jest dobre, ponieważ szczerze mówiąc, jest tam dużo 8-bitowego użycia. Zwłaszcza między ("ascii"), ("IBM500"), ("IBM037"). To, co było naprawdę potrzebne po wyjęciu z pudełka, to szereg metod szesnastkowych w stylu "OD". Python został wybrany, aby zmniejszyć wysiłek, a te rzeczy podwajają wymagany kod. Tak, wiem, że IBM500 to unikod. – mckenzm

0

jest to ta sama odpowiedź na powyższe, ale zmodyfikowane to działa z pythonem 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("")