Skip to content

Base64

Base64 encoding is widely used amongst different endpoints in Geometry Dash.

It is used to encode fields like level data, level descriptions, comments, etc.

GD uses URL-safe Base64 encoding, which uses [A-Z] and [a-z] letters along with _ and - as special characters.

Code

# taken from gd.py

from base64 import b64decode as standard_decode_base64
from base64 import b64encode as standard_encode_base64
from base64 import urlsafe_b64decode as standard_decode_base64_url_safe
from base64 import urlsafe_b64encode as standard_encode_base64_url_safe

# encoding

DEFAULT_ENCODING = "utf-8"
DEFAULT_ERRORS = "strict"

# padding

BASE64_PAD = 4
BASE64_INVALID_TO_PAD = 1
BASE64_PADDING = b"="

# last

LAST = ~0


def enforce_valid_base64(data: bytes) -> bytes:
    required = len(data) % BASE64_PAD

    if required:
        if required == BASE64_INVALID_TO_PAD:
            data = data[:LAST]

        else:
            data += BASE64_PADDING * (BASE64_PAD - required)

    return data


def decode_base64(data: bytes) -> bytes:
    return standard_decode_base64(enforce_valid_base64(data))


def encode_base64(data: bytes) -> bytes:
    return standard_encode_base64(data)


def decode_base64_url_safe(data: bytes) -> bytes:
    return standard_decode_base64_url_safe(enforce_valid_base64(data))


def encode_base64_url_safe(data: bytes) -> bytes:
    return standard_encode_base64_url_safe(data)


def decode_base64_string(
    string: str, encoding: str = DEFAULT_ENCODING, errors: str = DEFAULT_ERRORS
) -> str:
    return decode_base64(string.encode(encoding, errors)).decode(encoding, errors)


def encode_base64_string(
    string: str, encoding: str = DEFAULT_ENCODING, errors: str = DEFAULT_ERRORS
) -> str:
    return encode_base64(string.encode(encoding, errors)).decode(encoding, errors)


def decode_base64_string_url_safe(
    string: str, encoding: str = DEFAULT_ENCODING, errors: str = DEFAULT_ERRORS
) -> str:
    return decode_base64_url_safe(string.encode(encoding, errors)).decode(encoding, errors)


def encode_base64_string_url_safe(
    string: str, encoding: str = DEFAULT_ENCODING, errors: str = DEFAULT_ERRORS
) -> str:
    return encode_base64_url_safe(string.encode(encoding, errors)).decode(encoding, errors)