Crockford Base32 Integer Codec
Encode integers with Crockford Base32 and decode human-typed values that contain hyphens or confusable letters like O and I.
Code
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"))
Report a problem with this exampleOpens a pre-filled issue on GitHub.