How to encode and decode any string into Base‑36 in Python

1 Answer

0 votes
"""
Base‑36 encoding/decoding in Python
---------------------------------------------
Base‑36 digits: 0–9, A–Z

Encoding:
  - Convert string → bytes (UTF‑8)
  - Convert bytes → big integer (base‑256)
  - Convert big integer → base‑36 using built‑in base conversion

Decoding:
  - Convert base‑36 → big integer
  - Convert big integer → bytes (base‑256)
  - Convert bytes → original UTF‑8 string

Python automatically supports arbitrary‑precision integers,
so the implementation is clean and efficient.
"""

BASE36_DIGITS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"


def encode_to_base36(text: str) -> str:
    """
    Encode any UTF‑8 string into Base‑36.
    """
    # Convert string → bytes
    data = text.encode("utf-8")

    # Convert bytes → big integer (base‑256)
    n = 0
    for b in data:
        n = n * 256 + b

    # Convert big integer → Base‑36
    if n == 0:
        return "0"

    encoded = []
    while n > 0:
        n, rem = divmod(n, 36)
        encoded.append(BASE36_DIGITS[rem])

    return "".join(reversed(encoded))


def decode_from_base36(encoded: str) -> str:
    """
    Decode Base‑36 text back into the original UTF‑8 string.
    """
    encoded = encoded.upper()

    # Convert Base‑36 → big integer
    n = 0
    for c in encoded:
        n = n * 36 + BASE36_DIGITS.index(c)

    # Convert big integer → bytes (base‑256)
    if n == 0:
        return ""

    data = []
    while n > 0:
        n, rem = divmod(n, 256)
        data.append(rem)

    data.reverse()
    return bytes(data).decode("utf-8")


def main():
    text = "Hello Universe!"
    encoded = encode_to_base36(text)
    decoded = decode_from_base36(encoded)

    print("Original:", text)
    print("Base-36 encoded:", encoded)
    print("Decoded:", decoded)


if __name__ == "__main__":
    main()


"""
run:

Original: Hello Universe!
Base-36 encoded: LP4N024HJ1YVBVD84Y8TYQP
Decoded: Hello Universe!

"""

 



answered 2 days ago by avibootz
edited 2 days ago by avibootz
...