Code: Select all
import base64
def decode(q: str) -> bytes:
"""
Decode q-value with URL-safe Base64.
"""
if padding := -len(q) % 4:
q += "=" * padding
try:
data = base64.urlsafe_b64decode(q)
except Exception as e:
print(f"Problem with {q = !r}\n with {len(q) = }, {padding = }:",e)
return
q = 'GzAo4rlgGWP57WHO2G4KnuPaOJJ5X3tXYHJT6GS6GOyDe2bsXUaqYHbEAfust'
decode(q)
Code: Select all
Problem with q = 'GzAo4rlgGWP57WHO2G4KnuPaOJJ5X3tXYHJT6GS6GOyDe2bsXUaqYHbEAfust==='
with len(q) = 64, padding = 3:
Invalid base64-encoded string: number of data characters (61) cannot be 1 more than a multiple of 4
PS: Es gibt eine ähnliche Frage für die Länge 13, aber keine Antwort und verwirrende Kommentare (jemand sagt „Sie können 100 ‚=‘s verwenden, Python schneidet ab“, sonst sagt „2 ‚=‘ ist das Maximum“).
BEARBEITEN: Ich verstehe jetzt, dass ich möglicherweise 61 oder eine beliebige Anzahl von Bytes habe Daten, sollte aber niemals einen Base64-codierten String dieser Länge haben. Es stellte sich tatsächlich heraus, dass diese Zeichenfolge aus einer benutzerdefinierten Codierung stammt und ich nur vermutete, dass es sich um (Standard-)Base64 handelte (basierend auf dem Vorhandensein von [0-9A-Za-z-_]). Mittlerweile habe ich herausgefunden, dass es sich um eine benutzerdefinierte Variante handelt: Unter anderem verwenden sie die oben genannten Zeichen in dieser Reihenfolge, um 0-63 darzustellen, ähnlich wie Base62, aber mit den 2 zusätzlichen Zeichen), während Base64 „A“ für 0 usw. verwendet. Außerdem haben sie beliebige Längen, weil variable Anzahlen von Bits aus dem resultierenden „Bitstrom“ „gelesen“ werden, abhängig von zusätzlichen Informationen, die sich aus den dekodierten Daten selbst ergeben.
Mobile version