2015-02-27 2 views
1

Я читаю 16 байт из бинарного буфера имени raw:метод для чтения байтов в строку hexdigest

md5 = list(struct.unpack('16B', raw.read(16))) 

Это производит следующий список:

>>> print(md5) 
>>> [25, 94, 158, 89, 108, 25, 125, 20, 138, 164, 84, 137, 250, 82, 150, 202] 

мне нужно постройте правильную строку md5, которую я затем смогу использовать для сравнения с любыми hexdigest() от hashlib.md5()

В настоящее время я делаю это так:

md5 = list(struct.unpack('16B', raw.read(16))) 
for i, b in enumerate(md5): 
    md5[i] = hex(b) 
md5 = ''.join(md5).replace('0x', '') 

Это работает, но я не могу помочь, но чувствую, что я что-то не хватает. Есть ли более простое преобразование между данными в буфере и последней строкой?

Примечание: Я понимаю, что у меня есть другие виды дайджестов. Но в настоящее время я заинтересован в решении проблемы для шестнадцатеричного дайджеста.

ответ

3

Вы можете использовать hexlify для преобразования bytes (Python 3)/двоичный str (Python 2) в шестнадцатеричной строки (строка будет bytes на Python 3, поэтому нам нужно .decode('ascii') там, чтобы соответствовать против hexdigest, что str).

from binascii import hexlify 
hex_string = hexlify(raw.read(16)).decode('ascii') 

if md5.hexdigest() == hex_string: 
    ... 

Аналогично можно сравнить исходные байты с digest(); hexdigest() представляет собой только 32-символьное читаемое представление 16-байтового значения, которое является фактической суммой дайджеров MD5.

the_bytes = raw.read(16) 
if md5.digest() == the_bytes: 
    ... 
+0

Спасибо Антти. Это идеально. –

Смежные вопросы