2012-11-17 119 views
11

是否已將十六進制編碼解碼器從python 3.3中排除?當我寫代碼python 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 

這是什麼意思?我知道binascii.hexlify()但仍然.encode()方法很好! 有什麼建議嗎?

+2

還有http://bugs.python.org/issue7475 – jfs

+1

SO,'hex'代碼丟失!有什麼方法可以添加該編解碼器或方法,鏈接上有兩個文件,這有什麼作用? – iMagur

+0

要以十六進制格式轉換**數字**,仍然可以使用'hex(n)'。 – JeromeJ

回答

24

不,使用encode()來hexlify並不好。

您使用hex編解碼器的方式在Python 2中工作,因爲您可以在Python 2中的8位字符串上調用encode(),也就是說,您可以編碼已經編碼的東西。這沒有意義。 encode()用於將Unicode字符串編碼爲8位字符串,而不用於將8位字符串編碼爲8位字符串。

在Python 3中,您不能再在8位字符串上調用encode(),因此hex編解碼器變得毫無意義並被刪除。

雖然理論上可以有一個hex編解碼器並使用它像這樣:

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

使用binascii更容易,更好:

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

binascii.hexlify()需要緩衝區接口,對吧?那麼,有人可以請我解釋一下如何在緩衝區界面上執行格式化嗎? – iMagur

+0

@iMagur:對不起,我忘了編寫Python 3代碼,因爲我是在Python 2中編寫的(因爲hex_codec在Python 3中不存在)。這現在已經修復了。上面的binascii代碼在Python 3中工作,並告訴你如何去做。 在Python 3中,字符串是Unicode的,所以它們不能直接進行hextable,因此需要先將它們編碼爲「bytes」。 –

+0

這很好,因爲坦率地說有很多8位用法。特別是('ascii'),('IBM500'),('IBM037')。 真正需要的是一些「OD」風格的十六進制字符串方法。選擇Python是爲了減少工作量,這些東西使得所需代碼加倍。是的,我知道IBM500是unicode .. – mckenzm

0

這是上述相同的答案,但我修改所以它可以與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("")