2016-09-11 53 views
0

我在Python 2.7的代码工作片:为什么Python的3.5返回一个类型错误,而不是在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) 

我试图把它在Python 3.5的工作我换xrangerange但在底部移动的字符不再起作用并且返回TypeError: a bytes-like object is required, not 'str'。我一直无法弄清楚Python 3中改变了什么。任何帮助是极大的赞赏。

+5

因为Python 3在字节串和Unicode文本之间做了更明确的区分。 Python 2隐式编码和解码,这是许多令人困惑的错误的来源。 –

+1

单独的Stack Overflow有很多帖子解释了这个异常,并且有[Python porting HOWTO](https://docs.python.org/3/howto/pyporting.html),它也覆盖了文本和字节。 –

回答

4

让它正常工作。 chr()被替换为返回等同于该字符的byte。必须将md5hash初始化更改为空的byte变量而不是string。然后只需.decode()它在最后返回一个不错的字符串。

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() 
相关问题