Source code for ska_ser_skuid.base32
# https://www.crockford.com/base32.html
BASE32_ALPHABET = "0123456789abcdefghjkmnpqrstvwxyz"
[docs]
def b32encode(n: int) -> str:
"""Encode a non-negative integer using Crockford Base32.
Uses the alphabet ``0-9 a-z`` (excluding ``i``, ``l``, ``o``, ``u``).
:param n: Non-negative integer to encode.
:returns: Crockford Base32 string representation.
:raises ValueError: If *n* is negative.
"""
if n == 0:
return "0"
elif n < 0:
raise ValueError(f"Only encodes positive integers, got {n}")
encoded = ""
while n > 0:
n, remainder = divmod(n, 32)
encoded = BASE32_ALPHABET[remainder] + encoded
return encoded
[docs]
def b32decode(encoded_id: str) -> int:
"""Decode a Crockford Base32 string back to an integer.
:param encoded_id: A non-empty string using the Crockford Base32 alphabet.
:returns: The decoded non-negative integer.
:raises ValueError: If *encoded_id* is empty or contains an invalid character.
"""
if not encoded_id:
raise ValueError("Cannot decode empty string")
decoded = 0
for char in encoded_id:
if char not in BASE32_ALPHABET:
raise ValueError(f"Invalid base32 character: {char}")
decoded = decoded * 32 + BASE32_ALPHABET.index(char)
return decoded