2016-09-11 2 views
0

Ich habe ein Arbeits Stück Code in Python 2.7:Warum Python 3.5 Return eine Typeerror und nicht in Python 2.7

def reversetomd5(knownhash): 
    clean="" 
    for i in [1,2,3,4,5,7,8,9,10,11,13,14,15,16,18,19,20,21,22,24,25,26,27,28]: 
    clean+=knownhash[i] 
b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/" 
block=[] 
for i in xrange(2,24,3): 
    p1 = b64.index(clean[i-2]) 
    p2 = b64.index(clean[i-1]) 
    p3 = b64.index(clean[i]) 
    block.append(p1 << 12 | p2 << 6 | p3) 
md5hash="" 
for i in block: 
    n1 = i >> 8 
    n2 = i & 0xff 
    md5hash+=chr(n1)+chr(n2) 
return binascii.hexlify(md5hash) 

Ich versuche es in Python 3.5 Ich tauschte xrange mit range zum Laufen zu bringen, aber Die unten verschobene Figur funktioniert nicht mehr und gibt TypeError: a bytes-like object is required, not 'str' zurück. Ich habe nicht herausgefunden, was sich in Python 3 geändert hat, um das zu verursachen. Jede Hilfe wird sehr geschätzt.

+5

Weil Python 3 klarer zwischen Bytestrings und Unicode-Text unterscheidet. Python 2 codiert und dekodiert implizit eine Quelle vieler verwirrender Fehler. –

+1

Es gibt viele Beiträge hier auf Stack Overflow allein, die diese Ausnahme erklären, und es gibt die [Python porting HOWTO] (https://docs.python.org/3/howto/pyporting.html), die auch Text vs Bytes abdeckt . –

Antwort

4

Hat es richtig funktioniert. chr() wurde ersetzt, um das byte Äquivalent des Zeichens zurückzugeben. Musste die md5hash Initialisierung in eine leere byte Variable statt einer string ändern. Dann nur .decode() es am Ende, um eine schöne Zeichenfolge zurückzugeben.

def reversetomd5(knownhash): 
    clean="" 
    for i in [1,2,3,4,5,7,8,9,10,11,13,14,15,16,18,19,20,21,22,24,25,26,27,28]: 
    clean+=knownhash[i] 
b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/" 
block=[] 
for i in range(2,24,3): 
    p1 = b64.index(clean[i-2]) 
    p2 = b64.index(clean[i-1]) 
    p3 = b64.index(clean[i]) 
    block.append(p1 << 12 | p2 << 6 | p3) 
md5hash=b'' 
for i in block: 
    n1 = i >> 8 
    n2 = i & 0xff 
    md5hash+=bytes[(n1)]+bytes[(n2)] 
return binascii.hexlify(md5hash).decode() 
Verwandte Themen