#python
#python
Вопрос:
При попытке обновить модуль с python 2 до использования python 3 я сталкиваюсь с ошибками типа при попытке хэширования данных файла, я сталкиваюсь с ошибкой типа «Unicode-объекты должны быть закодированы перед хэшированием» когда я кодирую данные, он выдает ошибку типа «может объединять только str (не «байты») в 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()
Ответ №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
содержит дайджесты хэша.
Ответ №2:
.digest()
возвращает «байтовый объект», а не строку. Вам также нужно decode()
это, например:
info_pieces = sha1(data).digest().decode('utf-8')
или
info_pieces = str(sha1(data).digest(), 'utf-8')
Комментарии:
1. Я пытался сделать это таким образом, он просто выдает одно и то же «Unicode-объекты должны быть закодированы перед хешированием»
2. о, извините, я отвечал на
when I encode the data it then throws a TypeError "can only concatenate str (not "bytes") to str"
часть.