Go-তে Base64 ডিকোডিং দরকার পড়েই যায় — JWT পরীক্ষা, বাইনারি ফাইল অ্যাটাচমেন্ট, ক্লাউড সার্ভিস থেকে আসা API পেলোড। Go-এর স্ট্যান্ডার্ড encoding/base64প্যাকেজ এসব সামলাতে পারে, তবে ভুল এনকোডিং ভেরিয়েন্ট বেছে নেওয়া (স্ট্যান্ডার্ড বনাম URL-safe, padded বনাম unpadded) হলো “illegal base64 data” ত্রুটির সবচেয়ে সাধারণ কারণ। এখানে StdEncoding, URLEncoding, RawURLEncoding, base64.NewDecoder দিয়ে স্ট্রিমিং ডিকোডিং, JWT পেলোড পরীক্ষা এবং প্রায় সবাইকে প্রথমবারেই বিভ্রান্ত করে এমন চারটি সাধারণ ভুল কভার করা হয়েছে। ব্রাউজারে তাৎক্ষণিক ডিকোডিংয়ের জন্য, ToolDeck-এর Base64 ডিকোডার একটি লাইন কোড না লিখেই কাজ করে।
- ✓encoding/base64 Go স্ট্যান্ডার্ড লাইব্রেরির অংশ — কোনো go get প্রয়োজন নেই
- ✓JWT টোকেন এবং বেশিরভাগ আধুনিক API-র জন্য RawURLEncoding ব্যবহার করুন (প্যাডিং ছাড়া, URL-safe অ্যালফাবেট)
- ✓StdEncoding + এবং / সহ = প্যাডিং ব্যবহার করে; URLEncoding - এবং _ তে পরিবর্তন করে কিন্তু প্যাডিং রাখে
- ✓base64.NewDecoder যেকোনো io.Reader র্যাপ করে মেমরিতে লোড না করেই স্ট্রিমিং ডিকোড করে
- ✓সবসময় রিটার্ন করা error চেক করুন — ভুল প্যাডিং এবং ভুল অ্যালফাবেট illegal base64 data ত্রুটি তৈরি করে
Base64 ডিকোডিং কী?
Base64 এনকোডিং বাইনারি ডেটাকে 64টি প্রিন্টেবল ক্যারেক্টার (A–Z, a–z, 0–9 এবং আরও দুটি) ব্যবহার করে ASCII টেক্সট হিসেবে উপস্থাপন করে। ডিকোডিং এটিকে উল্টো করে — সেই ASCII উপস্থাপনাকে আবার আসল বাইটে রূপান্তরিত করে। প্রতি চারটি Base64 ক্যারেক্টার ঠিক 3 বাইটে ডিকোড হয়। এই পদ্ধতির দরকার পড়ে কারণ অনেক ট্রান্সপোর্ট লেয়ার (ইমেইল, HTTP হেডার, JSON ফিল্ড) raw বাইনারির জন্য নয়, শুধু টেক্সটের জন্য তৈরি। রাউন্ড-ট্রিপ দেখতে কেমন হয়:
package main
import (
"encoding/base64"
"fmt"
)
func main() {
// Raw bytes → Base64 encoded → decoded back to raw bytes
original := []byte("service_token:xK9mP2qR")
// Encoded: "c2VydmljZV90b2tlbjp4SzltUDJxUg=="
encoded := base64.StdEncoding.EncodeToString(original)
decoded, _ := base64.StdEncoding.DecodeString(encoded)
fmt.Println(string(decoded) == string(original)) // true
}encoding/base64 দিয়ে Go-তে Base64 ডিকোড করুন
encoding/base64 প্যাকেজ Go-এর সাথেই আসে — কোনো বাহ্যিক নির্ভরতা নেই। চারটি এনকোডিং ভেরিয়েন্ট রেডিমেড পাওয়া যায়, প্যাকেজ-লেভেল ভেরিয়েবল হিসেবে। স্ট্রিং ইনপুটের জন্য সবচেয়ে বেশি ব্যবহৃত ফাংশন হলো DecodeString, যা একটি byte slice এবং একটি error রিটার্ন করে।
package main
import (
"encoding/base64"
"fmt"
"log"
)
func main() {
// Standard Base64 — the alphabet uses + and / with = padding
encoded := "eyJob3N0IjoiZGItcHJvZC51cy1lYXN0LTEiLCJwb3J0Ijo1NDMyfQ=="
decoded, err := base64.StdEncoding.DecodeString(encoded)
if err != nil {
log.Fatalf("decode error: %v", err)
}
fmt.Println(string(decoded))
// {"host":"db-prod.us-east-1","port":5432}
}Decode মেথড স্ট্রিংয়ের পরিবর্তে byte slice-এ কাজ করে এবং ফলাফল একটি পূর্ব-বরাদ্দ ডেস্টিনেশন বাফারে লিখে। বাফারের সঠিক আকার নির্ধারণ করতে হবে — সর্বোচ্চ আকার পেতে base64.StdEncoding.DecodedLen(len(src)) ব্যবহার করুন (প্যাডিংয়ের কারণে এটি আসল ডিকোড করা দৈর্ঘ্যের চেয়ে কয়েক বাইট বেশি হতে পারে)।
package main
import (
"encoding/base64"
"fmt"
"log"
)
func main() {
src := []byte("eyJob3N0IjoiZGItcHJvZCIsInBvcnQiOjU0MzJ9")
dst := make([]byte, base64.RawStdEncoding.DecodedLen(len(src)))
n, err := base64.RawStdEncoding.Decode(dst, src)
if err != nil {
log.Fatalf("decode: %v", err)
}
fmt.Println(string(dst[:n]))
// {"host":"db-prod","port":5432}
}DecodedLen সঠিক দৈর্ঘ্য নয়, একটি উপরের সীমা রিটার্ন করে। ফলাফল সঠিকভাবে স্লাইস করতে সবসময় Decode থেকে n রিটার্ন ভ্যালু ব্যবহার করুন: dst[:n]।StdEncoding বনাম URLEncoding — সঠিক ভেরিয়েন্ট বেছে নেওয়া
এখানেই বেশিরভাগ বিভ্রান্তি তৈরি হয়। Go-এর encoding/base64 চারটি এনকোডিং অবজেক্ট প্রকাশ করে এবং ভুলটি বেছে নিলে অবশ্যই ত্রুটি পাবেন। পার্থক্যটা দুটো বিষয়ে: অ্যালফাবেট এবং প্যাডিং।
package main
import (
"encoding/base64"
"fmt"
)
func main() {
// JWT header payload — URL-safe, no padding
jwtHeader := "eyJhbGciOiJSUzI1NiIsImtpZCI6IjIwMjMtMDkifQ"
// Wrong: StdEncoding fails on URL-safe input without padding
_, err1 := base64.StdEncoding.DecodeString(jwtHeader)
fmt.Println("StdEncoding error:", err1)
// StdEncoding error: illegal base64 data at input byte 43
// Correct: RawURLEncoding — no padding, URL-safe alphabet
decoded, err2 := base64.RawURLEncoding.DecodeString(jwtHeader)
fmt.Println("RawURLEncoding ok:", err2, "→", string(decoded))
// RawURLEncoding ok: <nil> → {"alg":"RS256","kid":"2023-09"}
}এক নজরে চারটি ভেরিয়েন্ট:
আমার সাধারণ নিয়ম: JWT, OAuth ফ্লো বা ক্লাউড প্রোভাইডার SDK থেকে এলে প্রথমে RawURLEncoding ব্যবহার করুন। ইমেইল অ্যাটাচমেন্ট বা পুরনো ধাঁচের ওয়েব ফর্ম থেকে এলে StdEncoding চেষ্টা করুন। ত্রুটির বার্তাটি সবসময় সেই বাইট পজিশন জানায় যেখানে ডিকোডিং ব্যর্থ হয়েছে।
ফাইল এবং API রেসপন্স থেকে Base64 ডিকোড করা
Base64-এনকোডেড ফাইল পড়া
বাইনারি ফাইল (ছবি, PDF, সার্টিফিকেট) কখনো কখনো ডিস্কে Base64-এনকোডেড অবস্থায় সংরক্ষিত থাকে। ফাইলটি পড়ুন, trailing whitespace পরিষ্কার করুন, তারপর ডিকোড করুন:
package main
import (
"encoding/base64"
"fmt"
"log"
"os"
"strings"
)
func main() {
raw, err := os.ReadFile("certificate.pem.b64")
if err != nil {
log.Fatalf("read file: %v", err)
}
// Strip newlines — Base64 files often have line breaks every 76 chars
cleaned := strings.ReplaceAll(strings.TrimSpace(string(raw)), "\n", "")
decoded, err := base64.StdEncoding.DecodeString(cleaned)
if err != nil {
log.Fatalf("decode: %v", err)
}
if err := os.WriteFile("certificate.pem", decoded, 0600); err != nil {
log.Fatalf("write: %v", err)
}
fmt.Printf("decoded %d bytes → certificate.pem\n", len(decoded))
}API JSON রেসপন্স থেকে Base64 ফিল্ড ডিকোড করা
ক্লাউড API প্রায়ই JSON-এর ভেতরে Base64 স্ট্রিং হিসেবে বাইনারি ডেটা (এনক্রিপশন কী, সাইন করা blob, থাম্বনেইল) রিটার্ন করে। প্রথমে JSON আনমার্শাল করুন, তারপর দরকারি ফিল্ডটা ডিকোড করুন:
package main
import (
"encoding/base64"
"encoding/json"
"fmt"
"log"
"net/http"
)
type SecretResponse struct {
Name string `json:"name"`
Payload string `json:"payload"` // Base64-encoded secret value
Version int `json:"version"`
}
func fetchAndDecodeSecret(secretURL string) ([]byte, error) {
resp, err := http.Get(secretURL)
if err != nil {
return nil, fmt.Errorf("http get: %w", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("unexpected status: %d", resp.StatusCode)
}
var secret SecretResponse
if err := json.NewDecoder(resp.Body).Decode(&secret); err != nil {
return nil, fmt.Errorf("decode json: %w", err)
}
value, err := base64.StdEncoding.DecodeString(secret.Payload)
if err != nil {
return nil, fmt.Errorf("decode base64: %w", err)
}
return value, nil
}
func main() {
value, err := fetchAndDecodeSecret("https://api.example.com/secrets/db-password")
if err != nil {
log.Fatalf("fetch secret: %v", err)
}
fmt.Printf("secret value: %s\n", value)
}fmt.Errorf("decode base64: %w", err) দিয়ে ত্রুটি র্যাপ করুন। encoding/base64 থেকে আসা আসল ত্রুটির বার্তায় ব্যর্থতার বাইট পজিশন থাকে, যা ডিবাগিংয়ের সময় কাজে আসে।বড় Base64-এনকোডেড ফাইল স্ট্রিমিং
os.ReadFile দিয়ে 500 MB Base64-এনকোডেড ফাইল মেমরিতে লোড করে DecodeString কল করলে প্রায় 750 MB RAM ব্যবহার হয় (এনকোডেড স্ট্রিং এবং ডিকোডেড বাইট মিলিয়ে)। base64.NewDecoder যেকোনো io.Reader র্যাপ করে chunk-এ ডিকোড করে, মেমরি ব্যবহার প্রায় স্থির রাখে। একটি পরিষ্কার স্ট্রিমিং পাইপলাইনের জন্য io.Copy-এর সাথে যুক্ত করুন:
package main
import (
"encoding/base64"
"fmt"
"io"
"log"
"os"
)
func streamDecodeFile(srcPath, dstPath string) error {
src, err := os.Open(srcPath)
if err != nil {
return fmt.Errorf("open source: %w", err)
}
defer src.Close()
dst, err := os.Create(dstPath)
if err != nil {
return fmt.Errorf("create dest: %w", err)
}
defer dst.Close()
decoder := base64.NewDecoder(base64.StdEncoding, src)
written, err := io.Copy(dst, decoder)
if err != nil {
return fmt.Errorf("stream decode: %w", err)
}
fmt.Printf("written %d bytes to %s\n", written, dstPath)
return nil
}
func main() {
if err := streamDecodeFile("backup.tar.b64", "backup.tar"); err != nil {
log.Fatal(err)
}
}base64.NewDecoder পরিষ্কার, অবিচ্ছিন্ন Base64 ডেটা প্রত্যাশা করে। যদি সোর্স ফাইলে লাইন ব্রেক থাকে (PEM এবং MIME-এনকোডেড ফাইলে সাধারণ), স্ট্রিম করার আগে সোর্স রিডারকে একটি লাইন-স্ট্রিপিং রিডারে র্যাপ করুন অথবা ফাইল থেকে নিউলাইন সরিয়ে নিন।কমান্ড লাইন থেকে Base64 ডিকোডিং
বেশিরভাগ Go ডেভেলপার ডিবাগিংয়ে প্রথমে কমান্ড লাইনে যান। প্রতিটি macOS এবং Linux সিস্টেমেbase64 আসে; Windows-এ PowerShell-এ বিল্ট-ইন সমতুল্য আছে। API পেলোড দ্রুত পরীক্ষার জন্য এগুলো Go স্ক্রিপ্ট লেখার চেয়ে দ্রুত।
# Decode a Base64 string (Linux / macOS)
echo "eyJob3N0IjoiZGItcHJvZCIsInBvcnQiOjU0MzJ9" | base64 --decode
# {"host":"db-prod","port":5432}
# Decode and pretty-print with jq (pipe the JSON output)
echo "eyJob3N0IjoiZGItcHJvZCIsInBvcnQiOjU0MzJ9" | base64 --decode | jq .
# {
# "host": "db-prod",
# "port": 5432
# }
# Decode a Base64-encoded file to binary
base64 --decode < encrypted_payload.b64 > encrypted_payload.bin
# macOS uses -D flag instead of --decode
echo "c2VjcmV0LXRva2Vu" | base64 -Dকোনো টুল ইনস্টল না করে JWT টোকেন পরীক্ষার জন্য, টোকেনটি ToolDeck-এর Base64 ডিকোডারে পেস্ট করুন — ডট দিয়ে বিভক্ত করুন এবং প্রতিটি অংশ ডিকোড করুন।
উচ্চ-কার্যক্ষমতার বিকল্প: encoding/base64 ইতিমধ্যেই দ্রুত
Python-এর মতো নয়, যেখানে orjson বনাম json নিয়ে পারফরম্যান্সের বড় তর্ক আছে — Go-এর encoding/base64 ইতিমধ্যেই assembly-optimized এবং বেশিরভাগ কাজের জন্য সত্যিই দ্রুত। তবে যদি আপনি একটি tight loop-এ লক্ষ লক্ষ রেকর্ড প্রসেস করেন, filippo.io/base64 drop-in API সহ SIMD-accelerated ডিকোডিং প্রদান করে।
go get filippo.io/base64
package main
import (
"fmt"
"log"
"filippo.io/base64"
)
func main() {
// Drop-in replacement — same API as encoding/base64
encoded := "eyJob3N0IjoiY2FjaGUtcHJvZCIsInBvcnQiOjYzNzl9"
decoded, err := base64.StdEncoding.DecodeString(encoded)
if err != nil {
log.Fatalf("decode: %v", err)
}
fmt.Println(string(decoded))
// {"host":"cache-prod","port":6379}
}পারফরম্যান্স লাভ AVX2 সাপোর্ট সহ amd64-এ সবচেয়ে বেশি দেখা যায় — বড় ইনপুটে বেঞ্চমার্কে 2–4x থ্রুপুট উন্নতি দেখা গেছে। প্রতিদিনের API রেসপন্স ডিকোডিংয়ের জন্য (একবারে কয়েকশো বাইট), স্ট্যান্ডার্ড লাইব্রেরিই যথেষ্ট।
Go-তে Base64 JWT পেলোড ডিকোড করা
JWT পরীক্ষা প্রায় প্রতিটি ব্যাকএন্ড সার্ভিসে প্রয়োজন হয়। আমার অভিজ্ঞতায়, বেশিরভাগ ডিবাগিং সেশন “এই টোকেনে আসলে কী আছে?” — এই প্রশ্নে আসে — এবং আপনি পূর্ণ JWT লাইব্রেরি ছাড়াই এর উত্তর দিতে পারেন। টোকেনে ডট দিয়ে আলাদা তিনটি Base64url-এনকোডেড সেগমেন্ট থাকে। মাঝের সেগমেন্টটি আসলে আপনার কাছে গুরুত্বপূর্ণ পেলোড:
package main
import (
"encoding/base64"
"encoding/json"
"fmt"
"log"
"strings"
)
type JWTPayload struct {
Subject string `json:"sub"`
Issuer string `json:"iss"`
Expiry int64 `json:"exp"`
Roles []string `json:"roles"`
}
func decodeJWTPayload(token string) (*JWTPayload, error) {
parts := strings.Split(token, ".")
if len(parts) != 3 {
return nil, fmt.Errorf("invalid JWT: expected 3 segments, got %d", len(parts))
}
// JWT uses RawURLEncoding — URL-safe alphabet, no = padding
raw, err := base64.RawURLEncoding.DecodeString(parts[1])
if err != nil {
return nil, fmt.Errorf("decode payload: %w", err)
}
var payload JWTPayload
if err := json.Unmarshal(raw, &payload); err != nil {
return nil, fmt.Errorf("unmarshal payload: %w", err)
}
return &payload, nil
}
func main() {
token := "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJ1c3ItNDQyIiwiaXNzIjoiYXV0aC5leGFtcGxlLmNvbSIsImV4cCI6MTc0MTk1NjgwMCwicm9sZXMiOlsiYWRtaW4iLCJhdWRpdG9yIl19.SIGNATURE"
payload, err := decodeJWTPayload(token)
if err != nil {
log.Fatalf("jwt: %v", err)
}
fmt.Printf("Subject: %s\n", payload.Subject)
fmt.Printf("Issuer: %s\n", payload.Issuer)
fmt.Printf("Roles: %v\n", payload.Roles)
// Subject: usr-442
// Issuer: auth.example.com
// Roles: [admin auditor]
}সাধারণ ভুলসমূহ
আমি আসল কোড রিভিউতে এই চারটি ভুল সবই দেখেছি — বিশেষত প্রথম দুটি প্রায়ই দেখা যায় যখন কেউ নতুন auth প্রোভাইডার ইন্টিগ্রেট করে।
সমস্যা: JWT টোকেন এবং OAuth টোকেন URL-safe Base64 অ্যালফাবেট (- এবং _) ব্যবহার করে। এগুলো StdEncoding.DecodeString-এ পাঠালে 'illegal base64 data' ত্রুটি হয়।
সমাধান: আপনার ইনপুট সোর্স চেক করুন: auth সিস্টেম থেকে আসা টোকেন RawURLEncoding ব্যবহার করে; বাইনারি অ্যাটাচমেন্ট StdEncoding ব্যবহার করে।
// JWT header — URL-safe, no padding token := "eyJhbGciOiJSUzI1NiJ9" decoded, err := base64.StdEncoding.DecodeString(token) // err: illegal base64 data at input byte 19
// JWT header — correct encoding
token := "eyJhbGciOiJSUzI1NiJ9"
decoded, err := base64.RawURLEncoding.DecodeString(token)
// decoded: {"alg":"RS256"}
// err: nilসমস্যা: Decode একটি পূর্ব-বরাদ্দ বাফারে লিখে এবং আসলে কত বাইট লেখা হয়েছে তা রিটার্ন করে। DecodedLen একটি উপরের সীমা রিটার্ন করে, তাই বাফারের শেষে garbage বাইট থাকতে পারে।
সমাধান: সবসময় dst[:n] দিয়ে ফলাফল স্লাইস করুন — dst[:len(dst)] নয়।
dst := make([]byte, base64.StdEncoding.DecodedLen(len(src))) base64.StdEncoding.Decode(dst, src) fmt.Println(string(dst)) // may include trailing zero bytes
dst := make([]byte, base64.StdEncoding.DecodedLen(len(src)))
n, err := base64.StdEncoding.Decode(dst, src)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(dst[:n])) // correct — only the decoded bytesসমস্যা: টার্মিনাল, ইমেইল বা কনফিগ ফাইল থেকে কপি করা Base64 স্ট্রিংয়ে প্রায়ই trailing নিউলাইন বা স্পেস থাকে। সেগুলো সরাসরি DecodeString-এ পাঠালে whitespace ক্যারেক্টারে ব্যর্থ হয়।
সমাধান: ডিকোড করার আগে strings.TrimSpace (এবং এম্বেডেড নিউলাইনের জন্য strings.ReplaceAll) কল করুন।
// Value read from a config file with a trailing newline encoded := "c2VydmljZV9rZXk6eEtNcDI=\n" decoded, err := base64.StdEncoding.DecodeString(encoded) // err: illegal base64 data at input byte 24
encoded := "c2VydmljZV9rZXk6eEtNcDI=\n" cleaned := strings.TrimSpace(encoded) decoded, err := base64.StdEncoding.DecodeString(cleaned) // decoded: "service_key:xKMp2" // err: nil
সমস্যা: বাইনারি ডেটায় (ছবি, কম্প্রেসড পেলোড) string(decoded) কল করলে অবৈধ UTF-8 স্ট্রিং তৈরি হয়। Go স্ট্রিং যেকোনো বাইট ধরতে পারে, কিন্তু কিছু অপারেশন কনটেন্ট নষ্ট করে দেবে।
সমাধান: পুরো পাইপলাইন জুড়ে বাইনারি ডেটা []byte হিসেবে রাখুন। শুধুমাত্র তখনই string(decoded) কল করুন যখন নিশ্চিত যে ডিকোড করা কনটেন্ট টেক্সট।
decoded, _ := base64.StdEncoding.DecodeString(pngBase64)
// Treating binary PNG as a string loses data
imageStr := string(decoded)
os.WriteFile("image.png", []byte(imageStr), 0644) // may corruptdecoded, err := base64.StdEncoding.DecodeString(pngBase64)
if err != nil {
log.Fatal(err)
}
// Write bytes directly — no string conversion
os.WriteFile("image.png", decoded, 0644)মেথড তুলনা
সব ভেরিয়েন্ট স্ট্যান্ডার্ড লাইব্রেরিতে আসে — এগুলোর কোনোটির জন্যই বাহ্যিক নির্ভরতা নেই।
JWT টোকেন এবং OAuth ফ্লোর জন্য: RawURLEncoding। ইমেইল অ্যাটাচমেন্ট এবং MIME ডেটার জন্য: StdEncoding। ডিস্ক বা নেটওয়ার্ক থেকে আসা বড় বাইনারি ফাইলের জন্য: একটি রিডার base64.NewDecoder-এ র্যাপ করুন — এটি ফাইলের আকার নির্বিশেষে মেমরি ব্যবহার স্থির রাখে। কাস্টম অ্যালফাবেট প্রয়োজন? base64.NewEncoding(alphabet) বিশেষ ব্যবহারের ক্ষেত্রে নতুন এনকোডিং অবজেক্ট তৈরি করে।
ডেভেলপমেন্টের সময় দ্রুত একবার চেক করার জন্য, অনলাইন Base64 ডিকোডার একটি Go প্রোগ্রাম চালু করার চেয়ে দ্রুত।
সচরাচর জিজ্ঞাসা
Go-তে Base64 স্ট্রিং কীভাবে ডিকোড করব?
encoding/base64 ইম্পোর্ট করুন এবং base64.StdEncoding.DecodeString(s) কল করুন। এটি ([]byte, error) রিটার্ন করে — সবসময় error চেক করুন। যদি স্ট্রিংয়ে URL-safe ক্যারেক্টার (+ এবং / এর পরিবর্তে - এবং _) থাকে, তাহলে base64.URLEncoding.DecodeString ব্যবহার করুন। JWT টোকেন এবং বেশিরভাগ আধুনিক API-র জন্য, RawURLEncoding (প্যাডিং ছাড়া) সঠিক পছন্দ।
package main
import (
"encoding/base64"
"fmt"
"log"
)
func main() {
encoded := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
decoded, err := base64.RawURLEncoding.DecodeString(encoded)
if err != nil {
log.Fatalf("decode: %v", err)
}
fmt.Println(string(decoded))
// {"alg":"HS256","typ":"JWT"}
}Go-তে StdEncoding এবং URLEncoding-এর মধ্যে পার্থক্য কী?
StdEncoding স্ট্যান্ডার্ড Base64 অ্যালফাবেট ব্যবহার করে যেখানে + এবং / ক্যারেক্টার এবং = প্যাডিং থাকে — RFC 4648 §4-এ সংজ্ঞায়িত। URLEncoding + কে - দিয়ে এবং / কে _ দিয়ে প্রতিস্থাপন করে, যা আউটপুটকে URL এবং HTTP হেডারে percent-encoding ছাড়াই নিরাপদ করে — RFC 4648 §5-এ সংজ্ঞায়িত। JWT টোকেন, OAuth টোকেন এবং কোয়েরি স্ট্রিংয়ে এম্বেড করা ডেটার জন্য URLEncoding ব্যবহার করুন।
package main
import (
"encoding/base64"
"fmt"
)
func main() {
// Standard: may contain + / and = characters
std := base64.StdEncoding.EncodeToString([]byte("hello/world"))
fmt.Println(std) // "aGVsbG8vd29ybGQ="
// URL-safe: replaces + with - and / with _
url := base64.URLEncoding.EncodeToString([]byte("hello/world"))
fmt.Println(url) // "aGVsbG8vd29ybGQ=" (same — diff shows with different bytes)
// JWT headers never have padding — use RawURLEncoding
raw := base64.RawURLEncoding.EncodeToString([]byte("hello/world"))
fmt.Println(raw) // "aGVsbG8vd29ybGQ" (no trailing =)
}Go-তে "illegal base64 data" ত্রুটি কীভাবে ঠিক করব?
এই ত্রুটির মানে হলো ইনপুটে প্রত্যাশিত অ্যালফাবেটের বাইরে ক্যারেক্টার আছে, অথবা প্যাডিং ভুল। তিনটি সাধারণ কারণ: URL-safe ইনপুটে StdEncoding ব্যবহার করা (URLEncoding-এ পরিবর্তন করুন), প্যাডিং ছাড়া ইনপুটে padded এনকোডার ব্যবহার করা (RawStdEncoding/RawURLEncoding-এ পরিবর্তন করুন), অথবা trailing whitespace/নিউলাইন। ডিকোড করার আগে strings.TrimSpace দিয়ে whitespace পরিষ্কার করুন।
package main
import (
"encoding/base64"
"fmt"
"log"
"strings"
)
func main() {
// Input from a webhook payload — has newlines stripped from wire format
raw := " aGVsbG8gd29ybGQ= \n"
cleaned := strings.TrimSpace(raw)
decoded, err := base64.StdEncoding.DecodeString(cleaned)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(decoded)) // hello world
}Go-তে বড় Base64-এনকোডেড ফাইল স্ট্রিম-ডিকোড কীভাবে করব?
base64.NewDecoder(base64.StdEncoding, reader) ব্যবহার করুন যা যেকোনো io.Reader র্যাপ করে এবং চলতে চলতে ডিকোড করে। পুরো ফাইল মেমরিতে বাফার না করে ডেস্টিনেশনে লিখতে io.Copy দিয়ে পাইপ করুন। Base64-এনকোডেড বাইনারি অ্যাটাচমেন্ট বা বড় ডেটা পেলোড ডিকোড করার এটিই স্ট্যান্ডার্ড প্যাটার্ন।
package main
import (
"encoding/base64"
"io"
"log"
"os"
)
func main() {
src, err := os.Open("attachment.b64")
if err != nil {
log.Fatal(err)
}
defer src.Close()
dst, err := os.Create("attachment.bin")
if err != nil {
log.Fatal(err)
}
defer dst.Close()
decoder := base64.NewDecoder(base64.StdEncoding, src)
io.Copy(dst, decoder)
}Go-তে JWT লাইব্রেরি ছাড়াই Base64 JWT পেলোড ডিকোড করা কি সম্ভব?
হ্যাঁ। JWT হলো ডট দিয়ে যুক্ত তিনটি Base64url-এনকোডেড সেগমেন্ট। "." দিয়ে বিভক্ত করুন এবং দ্বিতীয় সেগমেন্ট (ইনডেক্স 1) base64.RawURLEncoding.DecodeString দিয়ে ডিকোড করুন — JWT হেডার এবং পেলোড URL-safe অ্যালফাবেট ব্যবহার করে এবং প্যাডিং থাকে না। সিগনেচার সেগমেন্ট (ইনডেক্স 2) বাইনারি এবং সাধারণত শুধুমাত্র ভেরিফিকেশনের জন্য প্রয়োজন।
package main
import (
"encoding/base64"
"fmt"
"log"
"strings"
)
func main() {
token := "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c3ItOTAxIiwicm9sZSI6ImFkbWluIn0.SIG"
parts := strings.Split(token, ".")
if len(parts) < 2 {
log.Fatal("invalid JWT format")
}
payload, err := base64.RawURLEncoding.DecodeString(parts[1])
if err != nil {
log.Fatalf("decode payload: %v", err)
}
fmt.Println(string(payload))
// {"sub":"usr-901","role":"admin"}
}HTTP API রেসপন্স থেকে Base64 ডেটা ডিকোড করতে কোন এনকোডিং ব্যবহার করব?
API ডকুমেন্টেশন দেখুন অথবা এনকোডেড স্ট্রিং পরীক্ষা করুন। যদি + বা / ক্যারেক্টার থাকে এবং = দিয়ে শেষ হয়, StdEncoding ব্যবহার করুন। যদি - এবং _ ক্যারেক্টার থাকে এবং = না থাকে, RawURLEncoding ব্যবহার করুন। অনিশ্চিত হলে প্রথমে RawURLEncoding চেষ্টা করুন — বেশিরভাগ আধুনিক API (OAuth2, JWT, Google Cloud, AWS) প্যাডিং ছাড়া URL-safe Base64 ব্যবহার করে।
package main
import (
"encoding/base64"
"strings"
)
// Detect encoding variant from the encoded string
func decodeAPIPayload(encoded string) ([]byte, error) {
// URL-safe characters without padding — common in modern APIs
if !strings.Contains(encoded, "+") && !strings.Contains(encoded, "/") {
return base64.RawURLEncoding.DecodeString(encoded)
}
// Standard Base64 with padding
return base64.StdEncoding.DecodeString(encoded)
}সম্পর্কিত টুলসমূহ
- Base64 এনকোডার — ব্রাউজারে বাইনারি ডেটা বা টেক্সট Base64-এ এনকোড করুন, Go ইউনিট টেস্টে পেস্ট করার জন্য টেস্ট ফিক্সচার তৈরিতে কার্যকর।
- JWT ডিকোডার — তিনটি JWT সেগমেন্ট একসাথে বিভক্ত ও ডিকোড করুন, ফিল্ড-বাই-ফিল্ড পেলোড পরীক্ষা সহ — ডিবাগিংয়ের সময় শুধু একটি টোকেন পড়তে কোনো Go কোড প্রয়োজন নেই।
- URL ডিকোডার — URL-এনকোডেড স্ট্রিং percent-decode করুন, API রেসপন্সে Base64url ডেটা এবং percent-encoded কোয়েরি প্যারামিটার মিশিয়ে থাকলে কাজে আসে।
- JSON ফরম্যাটার — Base64 JWT পেলোড বা API রেসপন্স ডিকোড করার পর, JSON এখানে পেস্ট করুন কাঠামো তাৎক্ষণিকভাবে pretty-print ও যাচাই করতে।