Pracuję nad projektem Pythona w wersji 2.6, który również ma przyszłe wsparcie dla pracy Pythona 3. W szczególności pracuję nad algorytmem digest-md5.Python: konkatenowanie bajtów za pomocą ciągu znaków
W Pythonie 2.6 działa bez tego importu:
from __future__ import unicode_literals
jestem w stanie napisać kawałek kodu, takich jak to:
a1 = hashlib.md5("%s:%s:%s" % (self.username, self.domain, self.password)).digest()
a1 = "%s:%s:%s" %(a1, challenge["nonce"], cnonce)
bez żadnych problemów, mój uwierzytelnianie działa prawidłowo. Kiedy próbuję tej samej linii kodu z unicode_literals importowane uzyskać wyjątek:
UnicodeDecodeError: „utf8” kodek nie potrafi dekodować bajtowy 0xa8 w pozycji 0: Kod nieoczekiwany bajt
Teraz jestem stosunkowo nowy pytonowi, więc utknąłem w tym. jeśli zastąpię% s w ciągu formatowania jako% r, mogę połączyć ciąg znaków, ale uwierzytelnianie nie działa. Specyfikacja digest-md5, którą przeczytałem, mówi, że 16-oktetowa ścieżka binarna musi być dołączona do tych innych ciągów.
Jakieś myśli?
Python 3.x wyraźnie oddziela struny od tablic bajtowych. W zależności od twoich potrzeb * może * pracować, aby poprzedzić wzorce ''% s:% s:% s "' z 'b', aby uzyskać tablicę bajtów, ale może to również dać złe wyniki. Jaki jest cel tego kodu? – Philipp
To jest fragment większego fragmentu kodu, który jest używany do algorytmu digest-md5, którego używam do uwierzytelniania na serwerze xmpp, i jest to specyficzny fragment kodu, który powoduje mi pewne problemy. Zawieszanie łańcucha formatowania za pomocą przycisku b wciąż powoduje ten sam problem. Oto niektóre informacje na temat tworzenia digest-md5 http://web.archive.org/web/20050224191820/http://cataclysm.cx/wip/digest-md5-crash.html – Macdiesel