Преобразование md5sum с помощью python

Я знаю, как найти контрольную сумму файла:

    # Print checksum of the file
    file = os.popen("md5sum -t " + indir + "/" + binfile)
    checksum = file.read().split(' ')[0]
    print "Checksum of " + binfile + " is " + checksum

Однако контрольная сумма представляет собой строку из 32 символов.
Теперь я хочу преобразовать эту контрольную сумму в строку из 16 символов, чтобы каждый символ представлял 2 символа в контрольной сумме (например, "63" будет кодом ASCII). символ 0x63).
Как мне это сделать?


person RanSh    schedule 03.09.2015    source источник
comment
Примечание: не используйте os.popen. Он устарел, начиная с Python 2.6.   -  person Cong Ma    schedule 03.09.2015


Ответы (1)


Почему бы просто не использовать hashlib?

Когда вы используете hashlib-совместимую реализацию хэша, такую ​​как hashlib.md5, хэш-объект предоставляет метод digest(), который делает то, что вы хотите.

Пример:

>>> import hashlib
>>> h = hashlib.md5("something")
>>> h.digest()
'C{\x93\r\xb8K\x80y\xc2\xdd\x80Jq\x93k_'
>>> hextxtdigest = h.hexdigest()
>>> hextxtdigest
'437b930db84b8079c2dd804a71936b5f'
>>> # The next line reinvents the wheel.
>>> whatyouwant = "".join([chr(int(hextxtdigest[x:x + 2], 16)) for x in xrange(0, len(hextxtdigest), 2)])
>>> whatyouwant == h.digest()
True

Я бы посоветовал вам использовать метод digest() и не изобретать велосипед.


Редактировать:

Чтобы использовать его для построения контрольной суммы из файла, вы обычно делаете что-то вроде (в псевдопитоне)

import hashlib
h = hashlib.md5()
open some file ...
read some bytes from file
h.update(those bytes read)
repeat read-and-update until end of file ...
close file

После этого хэш-объект h будет готов для получения нужного вам дайджеста. См. стандартную документацию по lib (Python 2, Python 3) и другие.

person Cong Ma    schedule 03.09.2015
comment
Большое спасибо, но ваш ответ с .join()... у меня сработал, а h.digest() не сработал. - person RanSh; 03.09.2015
comment
Возможно, дайджест() не сработал, потому что я не использовал h.update(). - person RanSh; 03.09.2015
comment
@RanSh Если у вас возникли проблемы с использованием hashlib, попробуйте открыть новый вопрос. - person Cong Ma; 03.09.2015