← Kembali ke kursus
Pelajaran kursus · Go
Pelajaran 41

Encode - Decode Base64

Ubah data biner menjadi teks aman-URL dan kembali.

Pahami konsepnya

Base64 merepresentasikan data biner dengan 64 karakter teks (A–Z, a–z, 0–9, + dan /) sehingga bisa lewat media yang hanya menerima teks: JSON, header HTTP, data-URL gambar, atau konten email. Setiap 3 byte menjadi 4 karakter — ukuran hasil selalu sekitar 4/3 dari asal.

Di Go, keduanya tinggal satu baris: base64.StdEncoding.EncodeToString(data) dan base64.StdEncoding.DecodeString(teks). Paketnya bekerja pada []byte; string cukup dikonversi lewat []byte(s).

Varian StdEncoding memakai + dan / yang bermasalah di URL. Untuk data yang akan menempati alamat web, gunakan URLEncoding (- dan _) atau RawURLEncoding tanpa padding =. Memilih varian yang salah biasanya berujuk pada hasil decode yang gagal diam-diam — selalu cocokkan encoder dan decodernya.

Coba contoh kode

package main

import (
    "encoding/base64"
    "fmt"
)

func main() {
    asli := []byte("rahasia kecil")
    kode := base64.StdEncoding.EncodeToString(asli)
    fmt.Println(kode) // cmFodGFzaWEga2VjaWw=

    balik, _ := base64.StdEncoding.DecodeString(kode)
    fmt.Println(string(balik)) // rahasia kecil
}

EncodeToString dan DecodeString saling melengkapi — data biner masuk, teks aman keluar, dan sebaliknya tanpa kehilangan satu byte pun. Tanda = di akhir adalah padding agar panjang hasil kelipatan empat. DecodeString mengembalikan error untuk teks yang bukan base64 valid — periksa bila sumbernya tidak dipercaya.

Varian aman-URL

func main() {
    data := []byte{0xfb, 0xff, 0xbe, 0x01}

    std := base64.StdEncoding.EncodeToString(data)
    url := base64.URLEncoding.EncodeToString(data)
    fmt.Println(std) // +/++AQ==
    fmt.Println(url) // -_-_AQ==
}

Byte biner ini menghasilkan + dan / pada StdEncoding — karakter yang berbahaya di query string karena berarti spasi dan pemisah path. URLEncoding menggantinya dengan - dan _ sehingga hasil aman ditanam langsung dalam URL.

Latihan singkat

Uji: encode data biner berikut — program harus mencetak persis `+/++AQ==`.