Crockford Base32 Integer Codec

Encode integers with Crockford Base32 and decode human-typed values that contain hyphens or confusable letters like O and I.

PythonData Integrity

Code

snippet
ALPHABET = "0123456789ABCDEFGHJKMNPQRSTVWXYZ"
DECODE = {char: index for index, char in enumerate(ALPHABET)}
DECODE.update({"I": 1, "L": 1, "O": 0})


def encode(number: int) -> str:
    if number < 0:
        raise ValueError("number must be non-negative")
    if number == 0:
        return "0"
    digits: list[str] = []
    while number:
        number, remainder = divmod(number, 32)
        digits.append(ALPHABET[remainder])
    return "".join(reversed(digits))


def decode(text: str) -> int:
    cleaned = text.upper().replace("-", "")
    if not cleaned:
        raise ValueError("input is empty")
    number = 0
    for char in cleaned:
        if char not in DECODE:
            raise ValueError(f"invalid character: {char!r}")
        number = number * 32 + DECODE[char]
    return number


if __name__ == "__main__":
    value = 123456789
    token = encode(value)
    print(token, decode(token))
    print(decode("3N-QK8N"), decode("3NQK8N"))