Istnieją dwa sposoby poprawienia opisanych tutaj danych wejściowych lub, dokładniej i zgodnie z OP, aby metoda b64decode modułu Pythona base64 mogła przetwarzać dane wejściowe na coś bez wywoływania niezauważonego wyjątku:
- Dołącz == na końcu danych wejściowych i wywołaj base64.b64decode (...)
Jeśli to powoduje wyjątek, to
ja. Złap to przez try / z wyjątkiem,
ii. (R?) Usuń dowolne = znaki z danych wejściowych (uwaga: może to nie być konieczne),
iii. Dołącz A == do danych wejściowych (będą działać od A == do P ==),
iv. Wywołaj base64.b64decode (...) z tymi A == - dołączonymi danymi wejściowymi
Wynik z punktu 1. lub punktu 2. powyżej da pożądany rezultat.
Ostrzeżenia
Nie gwarantuje to, że zdekodowany wynik będzie taki, jaki był pierwotnie zakodowany, ale (czasami?) Zapewni OP wystarczający do pracy z:
Nawet z korupcją chcę wrócić do pliku binarnego, ponieważ nadal mogę uzyskać przydatne informacje ze strumienia ASN.1 ”).
Zobacz co wiemy i Założenia poniżej.
TL; DR
Z kilku szybkich testów base64.b64decode (...)
wygląda na to, że ignoruje znaki inne niż [A-Za-z0-9 + /]; co obejmuje ignorowanie = s, chyba że są to ostatnie znaki w przeanalizowanej grupie czterech, w którym to przypadku = s przerywa dekodowanie (a = b = c = d = daje taki sam wynik jak abc = i a = = b == c == daje taki sam wynik jak ab ==).
Okazuje się również, że wszystkie dołączane znaki są ignorowane po punkcie, w którym base64.b64decode (...) kończy dekodowanie np. Od an = jako czwarty w grupie.
Jak zauważono w kilku komentarzach powyżej, na końcu danych wejściowych wymagane jest albo zero, albo jeden lub dwa = s wypełnienia, gdy wartość [liczba przeanalizowanych znaków do tego punktu modulo 4] wynosi 0 lub 3, lub 2, odpowiednio. Tak więc, począwszy od pozycji 3. i 4. powyżej, dołączenie dwóch lub więcej = s do danych wejściowych, poprawi wszelkie problemy [Nieprawidłowe wypełnienie] w tych przypadkach.
JEDNAK, dekodowanie nie może obsłużyć przypadku, w którym [całkowita liczba przeanalizowanych znaków modulo 4] wynosi 1, ponieważ wymaga co najmniej dwóch zakodowanych znaków, aby reprezentować pierwszy zdekodowany bajt w grupie trzech zdekodowanych bajtów. W un uszkodzony zakodowane dane wejściowe, to [N modulo 4] = 1 przypadek nie dzieje, ale jak PO stwierdził, że znaki mogą być niedostępne, może się zdarzyć tutaj. Dlatego samo dołączanie = s nie zawsze będzie działać i dlaczego dołączanie A == będzie działać, gdy dołączanie == nie. NB Użycie [A] jest prawie dowolne: dodaje tylko wyczyszczone (zerowe) bity do zdekodowanych, które mogą być poprawne lub nie, ale wtedy przedmiotem tutaj nie jest poprawność, ale uzupełnienie przez base64.b64decode (...) bez wyjątków .
To, co wiemy z PO, a zwłaszcza z kolejnych komentarzy, to
- Podejrzewa się, że w danych wejściowych zakodowanych algorytmem Base64 brakuje danych (znaków)
- Kodowanie Base64 wykorzystuje standardowe 64 wartości-miejsc oraz dopełnienie: AZ; az; 0-9; +; /; = jest dopełnieniem. Potwierdza to lub przynajmniej sugeruje fakt, że
openssl enc ...
działa.
Założenia
- Dane wejściowe zawierają tylko 7-bitowe dane ASCII
- Jedynym rodzajem uszkodzenia jest brak zakodowanych danych wejściowych
- OP nie dba o zdekodowane dane wyjściowe w dowolnym momencie po tym, co odpowiada brakującym zakodowanym danym wejściowym
Github
Oto opakowanie umożliwiające wdrożenie tego rozwiązania:
https://github.com/drbitboy/missing_b64
base64.b64decode(strg, '-_')
? To jest a priori, bez zadawania sobie trudu dostarczenia jakichkolwiek przykładowych danych, najbardziej prawdopodobnego rozwiązania Twojego problemu w Pythonie. Zaproponowane „metody” to sugestie DEBUGOWANIA, KONIECZNIE „trafienie i chybienie”, biorąc pod uwagę niedostatek dostarczonych informacji.