#python #hash #binary-data
#python #хэш #двоичные данные
Вопрос:
Я хочу хранить хэши как двоичные (64 байта). Но для любого типа API (веб-службы) Я бы хотел передавать их в виде строк. hashlib.hexdigest()
даст мне строку и hashlib.digest()
даст мне двоичный файл. Но если, например, я читаю в двоичной версии с диска, как мне преобразовать ее в строку? И если я прочитаю строку из веб-службы, как мне преобразовать ее в двоичный файл?
Ответ №1:
Комментарии:
1. Или вы можете использовать встроенный
bytes.fromhex()
.
Ответ №2:
В 2.x вы можете использовать str.decode('hex')
и str.encode('hex')
для преобразования между необработанными байтами и шестнадцатеричной строкой. В 3.x вам нужно использовать binascii
модуль.
Ответ №3:
Вы могли бы начать со строковой версии для передачи и отображения:
>>> import hashlib
>>> string_version = hashlib.md5(b'hello world').hexdigest()
Преобразуйте его в двоичный файл, чтобы записать его на диск:
>>> save_as_binary = string_version.encode('utf-8')
>>> print(save_as_binary)
b'5eb63bbbe01eeed093cb22bb8f5acdc3'
При чтении с диска преобразуйте его обратно в строку:
>>> back_to_string = save_as_binary.decode('utf-8')
>>> print(back_to_string)
5eb63bbbe01eeed093cb22bb8f5acdc3
Комментарии:
1. Чтобы уточнить:
hashlib.md5(b'hello world').hexdigest().decode('hex') == hashlib.md5(b'hello world').digest()
2. @Бен большое спасибо . Это сэкономило много моего времени. Я работаю над aws s3 и пытался выяснить, как происходит преобразование ETag из string-> binary-> string .. В Интернете есть много ответов, но у меня ничего не получалось. Но когда я попробовал ваш ответ, он сработал просто отлично. Так что большое вам спасибо.
3. Оператор
string_version.encode('utf-8')
не предоставляет двоичную интерпретацию шестнадцатеричного числа. Он просто выдает двоичную строку шестнадцатеричной строки. save_as_binary — это не то же самое, что digest(), который был запрошен.