Every character in your text becomes its ASCII number (e.g. 'H' → 72, 'i' → 105).
Those bytes are grouped into 3-byte chunks (24 bits) then split into four 6-bit groups.
Each 6-bit value maps to one of 64 characters: A-Z, a-z, 0-9, +, /. That's where the name comes from!
= padding is added to make the output length a multiple of 4. This decoder strips it automatically.
Decoding is the exact reverse — Base64 chars → 6-bit groups → bytes → original text. ~33% size overhead is the trade-off for safe ASCII transport.