A.46. Encode - Decode Base64

Go menyediakan package encoding/base64, berisikan fungsi-fungsi untuk kebutuhan encode dan decode data ke bentuk base64 dan sebaliknya. Data yang akan di-encode harus bertipe []byte, maka perlu dilakukan casting untuk data-data yang tipenya belum []byte.

Proses encoding dan decoding bisa dilakukan via beberapa cara yang pada chapter ini kita akan pelajari.

A.46.1. Penerapan Fungsi EncodeToString() & DecodeString()

Fungsi EncodeToString() digunakan untuk encode data dari bentuk string ke base64. Fungsi DecodeString() melakukan kebalikan dari EncodeToString(). Berikut adalah contoh penerapannya.

package main

import "encoding/base64"
import "fmt"

func main() {
    var data = "john wick"

    var encodedString = base64.StdEncoding.EncodeToString([]byte(data))
    fmt.Println("encoded:", encodedString)

    var decodedByte, _ = base64.StdEncoding.DecodeString(encodedString)
    var decodedString = string(decodedByte)
    fmt.Println("decoded:", decodedString)
}

Variabel data yang bertipe string, harus di-casting terlebih dahulu ke dalam bentuk []byte sebelum di-encode menggunakan fungsi base64.StdEncoding.EncodeToString(). Hasil encode adalah data base64 bertipe string.

Sedangkan pada fungsi decode base64.StdEncoding.DecodeString(), data base64 bertipe string di-decode kembali ke string aslinya, tapi bertipe []byte. Ekspresi string(decodedByte) menjadikan data []byte tersebut berubah menjadi string.

Dasar Pemrograman Golang - Encode & decode data string

A.46.2. Penerapan Fungsi Encode() & Decode()

Kedua fungsi ini kegunaannya sama dengan fungsi yang sebelumnya kita bahas, salah satu pembedanya adalah data yang akan dikonversi dan hasilnya bertipe []byte. Penggunaan cara ini cukup panjang karena variabel penyimpan hasil encode maupun decode harus disiapkan terlebih dahulu, dan harus memiliki lebar data sesuai dengan hasil yang akan ditampung (yang nilainya bisa dicari menggunakan fungsi EncodedLen() dan DecodedLen()).

Lebih jelasnya silakan perhatikan contoh berikut.

var data = "john wick"

var encoded = make([]byte, base64.StdEncoding.EncodedLen(len(data)))
base64.StdEncoding.Encode(encoded, []byte(data))
var encodedString = string(encoded)
fmt.Println(encodedString)

var decoded = make([]byte, base64.StdEncoding.DecodedLen(len(encoded)))
var _, err = base64.StdEncoding.Decode(decoded, encoded)
if err != nil {
    fmt.Println(err.Error())
}
var decodedString = string(decoded)
fmt.Println(decodedString)

Fungsi base64.StdEncoding.EncodedLen(len(data)) menghasilkan informasi lebar variable data ketika sudah di-encode. Nilai tersebut kemudian ditentukan sebagai lebar alokasi tipe []byte pada variabel encoded yang nantinya digunakan untuk menampung hasil encoding.

Fungsi base64.StdEncoding.DecodedLen() memiliki kegunaan sama dengan EncodedLen(), hanya saja digunakan untuk keperluan decoding.

Dibanding 2 fungsi sebelumnya, fungsi Encode() dan Decode() ini memiliki beberapa perbedaan. Selain lebar data penampung encode/decode harus dicari terlebih dahulu, terdapat perbedaan lainnya, yaitu pada fungsi ini hasil encode/decode tidak didapat dari nilai kembalian, melainkan dari parameter. Variabel yang digunakan untuk menampung hasil, disisipkan pada parameter fungsi tersebut.

Pada pemanggilan fungsi encode/decode, variabel encoded dan decoded tidak disisipkan nilai pointer-nya, cukup di-pass dengan cara biasa, tipe datanya sudah dalam bentuk []byte.

A.46.3. Encode & Decode Data URL

Khusus encode data string yang isinya merupakan URL, lebih efektif menggunakan URLEncoding dibandingkan StdEncoding.

Cara penerapannya kurang lebih sama, bisa menggunakan metode pertama maupun metode kedua yang sudah dibahas di atas. Cukup ganti StdEncoding menjadi URLEncoding.

var data = "https://kalipare.com/"

var encodedString = base64.URLEncoding.EncodeToString([]byte(data))
fmt.Println(encodedString)

var decodedByte, _ = base64.URLEncoding.DecodeString(encodedString)
var decodedString = string(decodedByte)
fmt.Println(decodedString)