当尝试将模块从python 2升级到使用python 3时,我在尝试对文件数据进行哈希处理时遇到类型错误,当我对数据进行编码时,我遇到TypeError“ Unicode对象必须在哈希之前进行编码”引发TypeError“只能将str(而不是“ bytes”)连接到str”
with open(realPath, "rb") as fn:
while True:
filedata = fn.read(self.piece_length)
if len(filedata) == 0:
break
length += len(filedata)
##First error was here fixed with .decode()
data += filedata.decode('utf-8')
if len(data) >= self.piece_length:
info_pieces += sha1(data[:self.piece_length]).digest()
data = data[self.piece_length:]
if check_md5:
md5sum.update(filedata)
if len(data) > 0:
##New error happens here
info_pieces += sha1(data).digest()
答案 0 :(得分:1)
哈希函数现在可以使用bytes
,而不是str
。因此,您传递给sha1
的对象应该是bytes
,并且.digest()
的返回值也将是bytes
。
因此,在传递给data
之前,应将字符串sha1()
编码为字节,例如:
info_pieces += sha1(data[:self.piece_length].encode('utf-8')).digest()
请确保已初始化data = ''
和info_pieces = b''
之类的变量,因为data
是已解码的文本,并且info_pieces
包含哈希摘要。
答案 1 :(得分:0)
.digest()
返回一个“字节对象”,而不是字符串。您还需要decode()
,例如:
info_pieces += sha1(data).digest().decode('utf-8')
或
info_pieces += str(sha1(data).digest(), 'utf-8')