Кодирование и декодирование в Python с MD5 () - PullRequest
2 голосов
/ 13 января 2011

Запуск этого кода в Ubuntu 10.10 в Python 3.1.1

Я получаю следующую ошибку:

UnicodeDecodeError: кодек «utf8» не может декодировать байт 0xd3 в позиции0: недопустимый байт продолжения

И позиция ошибки изменяется в зависимости от того, когда я запускаю следующий код: (не реальные ключи или секрет)

sandboxAPIKey = "wed23hf5yxkbmvr9jsw323lkv5g"
sandboxSharedSecret = "98HsIjh39z"

def buildAuthParams():
    authHash = hashlib.md5();

    #encoding because the update on md5() needs a binary rep of the string
    temp = str.encode(sandboxAPIKey + sandboxSharedSecret + repr(int(time.time())))
    print(temp)

    authHash.update(temp)

    #look at the string representation of the binary digest
    print(authHash.digest())

    #now I want to look at the string representation of the digest
    print(bytes.decode(authHash.digest()))

Вотвывод прогона (с информацией о сигнале и ключе, измененной по сравнению с реальным выводом)

b'sdwe5yxkwewvr9j343434385gkbH4343h4343dz129443643474'
b'\x945EM3\xf5\xa6\xf6\x92\xd1\r\xa5K\xa3IO'

print(bytes.decode(authHash.digest()))
UnicodeDecodeError: 'utf8' codec can't decode byte 0x94 in position 0: invalid start byte

Я предполагаю, что что-то не так с моим вызовом для декодирования, но я не могу понять, что это такое.Печать authHash.digest мне кажется действительной.

Буду очень признателен за любые идеи о том, как заставить это работать

1 Ответ

3 голосов
/ 13 января 2011

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

То же самое произойдет, если вы попытаетесь декодировать его, используя ascii, любое значение больше 127 является недопустимым символом ascii.

Таким образом, если вы пытаетесь получить версию для печати хэша md5, вам следует ее шестнадцатеричный, это стандартный способ печати любого типа хеша, каждый байт представлен двумя шестнадцатеричными цифрами.

Для этого вы можете использовать:

authHash.hexdigest()

Если вам нужно использовать его в URL-адресе, вам, вероятно, нужно кодировать байтовый массив в base64:

base64.b64encode(authHash.digest())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...