ToolDeck

Python Base64 เข้ารหัส — b64encode() คู่มือ

·Backend Developer·ตรวจสอบโดยPriya Sharma·เผยแพร่เมื่อ

ใช้ ตัวเข้ารหัส Base64 ออนไลน์ ฟรีโดยตรงในเบราว์เซอร์ของคุณ — ไม่ต้องติดตั้ง

ลอง ตัวเข้ารหัส Base64 ออนไลน์ ออนไลน์ →

เมื่อคุณสร้างบริการ Python ที่ส่ง credential ใน HTTP Basic Auth header ฝัง binary asset ในการตอบกลับ API หรือเก็บ TLS certificate ใน environment variable คุณจะเขียน code Python สำหรับ base64 encode อยู่เป็นประจำ Python มาพร้อมโมดูล base64 ในไลบรารีมาตรฐาน — ไม่ต้อง ติดตั้ง pip — แต่ความแตกต่างระหว่าง bytes กับ string และความต่างระหว่าง b64encode, urlsafe_b64encode และ encodebytes ทำให้ developer สับสนบ่อย กว่าที่คาด สำหรับการ encode ด่วนโดยไม่ต้องเขียน code เครื่องมือเข้ารหัส Base64 ของ ToolDeck จัดการได้ทันทีในเบราว์เซอร์ คู่มือนี้ครอบคลุม stdlib API ทั้งหมด การเข้ารหัสแบบ URL-safe สำหรับ JWT สถานการณ์ไฟล์และการตอบกลับ API ทางลัด CLI ทางเลือกที่มี ประสิทธิภาพสูง และ 4 ข้อผิดพลาดที่พบบ่อยที่สุดในการ code review

  • base64.b64encode() รับ bytes ไม่ใช่ str — เรียก .encode("utf-8") บน string อินพุตก่อนเสมอ
  • ค่าที่คืนกลับมาก็เป็น bytes เช่นกัน — เรียก .decode("utf-8") หรือ .decode("ascii") เพื่อรับ str ธรรมดาที่ฝังใน JSON หรือ HTTP header ได้
  • base64.urlsafe_b64encode() แทน + → - และ / → _ แต่คง padding = ไว้ — ลบออกด้วย .rstrip("=") สำหรับ JWT segment
  • base64.encodebytes() แทรก \n ทุก 76 ตัวอักษร (รูปแบบ MIME) — ห้ามใช้กับ data URI, JSON field หรือ environment variable
  • pybase64 (C extension, API เข้ากันได้) เข้ารหัสเร็วกว่า stdlib 2–10 เท่า เหมาะสำหรับบริการ high-throughput ที่ประมวลผล payload ขนาดใหญ่

การเข้ารหัส Base64 คืออะไร?

Base64 แปลงข้อมูลไบนารีใดๆ เป็น string ที่สร้างจากอักขระ ASCII 64 ตัวที่พิมพ์ได้: A–Z, a–z, 0–9, + และ / ทุก 3 byte ของอินพุตแมปกับอักขระ Base64 พอดี 4 ตัว หากความยาวอินพุตไม่ใช่ทวีคูณของ 3 จะเพิ่มอักขระ padding = หนึ่งหรือสองตัว เอาต์พุตที่เข้ารหัส แล้วจะใหญ่กว่าต้นฉบับประมาณ 33% เสมอ

Base64 ไม่ใช่ การเข้ารหัสความปลอดภัย — ไม่ได้ให้ความลับใดเลย วัตถุประสงค์คือ ความปลอดภัยในการส่งข้อมูล: โปรโตคอลและระบบจัดเก็บข้อมูลหลายอย่างถูกออกแบบมาสำหรับ ข้อความ ASCII 7 บิต และไม่สามารถส่ง byte ไบนารีใดๆ ได้อย่างปลอดภัย Base64 ช่วยเชื่อม ช่องว่างนั้น กรณีใช้งาน Python ทั่วไปได้แก่ HTTP Basic Auth header, data URI สำหรับ ฝังรูปภาพใน HTML หรือ CSS, segment ของ JWT token, ไฟล์แนบ MIME ในอีเมล และการส่ง binary blob ผ่าน environment variable หรือ JSON API

Before · text
After · text
deploy-svc:sk-prod-9f2a1c3e8b4d
ZGVwbG95LXN2Yzpzay1wcm9kLTlmMmExYzNlOGI0ZA==

base64.b64encode() — คู่มือการเข้ารหัสมาตรฐานพร้อมตัวอย่าง

base64.b64encode(s, altchars=None) เป็น ฟังก์ชันเข้ารหัสหลักใน stdlib ของ Python อยู่ในโมดูล base64 ที่มาพร้อมทุกการติดตั้ง Python ฟังก์ชันรับออบเจกต์ bytes และคืนออบเจกต์ bytes ที่มีการแสดงผล ASCII Base64 คู่มือนี้ใช้ Python 3.x (3.6+) ตลอด

ตัวอย่างขั้นต่ำที่ใช้งานได้

Python 3.6+
import base64

# เข้ารหัสคู่ credential API สำหรับ HTTP Basic Auth header
service_id = "deploy-svc"
api_key    = "sk-prod-9f2a1c3e8b4d"

credential_bytes   = f"{service_id}:{api_key}".encode("utf-8")
encoded_bytes      = base64.b64encode(credential_bytes)
encoded_str        = encoded_bytes.decode("ascii")  # bytes → str

print(encoded_str)
# ZGVwbG95LXN2Yzpzay1wcm9kLTlmMmExYzNlOGI0ZA==

import urllib.request

req = urllib.request.Request("https://api.internal/v1/deployments")
req.add_header("Authorization", f"Basic {encoded_str}")
# ค่า header: Basic ZGVwbG95LXN2Yzpzay1wcm9kLTlmMmExYzNlOGI0ZA==

ตัวอย่างขยาย — sort_keys, nested object, round-trip decode

Python 3.6+
import base64
import json

# เข้ารหัส server configuration แบบมีโครงสร้างสำหรับ environment variable
server_config = {
    "host":           "db-primary.eu-west-1.internal",
    "port":           5432,
    "database":       "analytics_prod",
    "max_connections": 150,
    "ssl": {
        "mode":          "verify-full",
        "cert_path":     "/etc/ssl/certs/db-client.crt",
        "reject_self_signed": True,
    },
}

config_json    = json.dumps(server_config, sort_keys=True)
encoded_bytes  = base64.b64encode(config_json.encode("utf-8"))
encoded_str    = encoded_bytes.decode("ascii")

print(encoded_str[:60] + "...")
# eyJkYXRhYmFzZSI6ICJhbmFseXRpY3NfcHJvZCIsICJob3N0IjogImRi...

# ถอดรหัสและตรวจสอบ round-trip
decoded_json   = base64.b64decode(encoded_str).decode("utf-8")
restored       = json.loads(decoded_json)

print(restored["host"])            # db-primary.eu-west-1.internal
print(restored["ssl"]["mode"])     # verify-full
หมายเหตุ:b64decode() มีความยืดหยุ่นตามค่าเริ่มต้น — จะ เพิกเฉยต่ออักขระที่ไม่ถูกต้องอย่างเงียบๆ รวมถึงช่องว่างและขึ้นบรรทัดใหม่ ส่ง validate=True เพื่อ raise binascii.Error กับอักขระที่ไม่ใช่ Base64 ใช้สิ่งนี้ เมื่อถอดรหัสอินพุตที่ไม่น่าเชื่อถือจากระบบภายนอก

การเข้ารหัส string แบบ Non-ASCII และ Unicode ใน Python

string Python 3 เป็น Unicode ตามค่าเริ่มต้น โมดูล base64 ทำงานกับ bytes ไม่ใช่ str — ดังนั้นต้องเข้ารหัส string เป็น bytes ก่อนส่งผ่าน การเลือก encoding สำคัญมาก: UTF-8 จัดการทุก Unicode code point และเป็นค่าเริ่มต้นที่ถูกต้องสำหรับกรณีใช้งานเกือบทั้งหมด

Python 3.6+
import base64

# เข้ารหัสเนื้อหาหลายภาษา — ชื่อแสดงผลผู้ใช้จากแพลตฟอร์มนานาชาติ
user_names = [
    "สมชาย ใจดี",           # ภาษาไทย — Unicode
    "田中太郎",              # อักขระ CJK — 3 bytes ต่อตัวใน UTF-8
    "Мария Соколова",      # Cyrillic — U+041C ขึ้นไป
    "สุนีย์ มีสุข",          # ภาษาไทย — Unicode
]

for name in user_names:
    encoded = base64.b64encode(name.encode("utf-8")).decode("ascii")
    decoded = base64.b64decode(encoded).decode("utf-8")

    print(f"ต้นฉบับ  : {name}")
    print(f"เข้ารหัส : {encoded}")
    print(f"Round-trip: {decoded}")
    print(f"ตรงกัน   : {name == decoded}")
    print()

# ต้นฉบับ  : Мария Соколова
# เข้ารหัส : 0JzQsNGA0LjRjyDQodC+0LrQvtC70L7QstCw
# Round-trip: Мария Соколова
# ตรงกัน   : True
หมายเหตุ:หากต้องการยืนยันว่าการเข้ารหัสถูกต้องสำหรับ string เฉพาะ วาง Base64 output ลงใน เครื่องมือเข้ารหัส Base64 ของ ToolDeck โดยตรง — จะถอดรหัสแบบ real-time และแสดงการแทนค่า byte UTF-8 ที่แน่นอน มีประโยชน์ เมื่อ debug Cyrillic, CJK หรือ emoji ใน payload string

โมดูล base64 — อ้างอิงฟังก์ชัน

โมดูล base64 เปิดเผยฟังก์ชันเข้ารหัส หลายตัว นี่คืออ้างอิงครบถ้วนสำหรับฟังก์ชันที่คุณจะพบในทางปฏิบัติ:

ฟังก์ชันอินพุตคืนค่าคำอธิบาย
b64encode(s, altchars=None)bytesbytesBase64 มาตรฐาน (RFC 4648 §4). altchars แทน + และ / ด้วย byte ที่กำหนดเอง 2 ตัว
b64decode(s, altchars=None, validate=False)bytes | strbytesถอดรหัส Base64 มาตรฐาน validate=True raise binascii.Error กับอักขระอินพุตที่ไม่ถูกต้อง
urlsafe_b64encode(s)bytesbytesBase64 แบบ URL-safe (RFC 4648 §5). ใช้ - และ _ แทน + และ / คง padding = ไว้
urlsafe_b64decode(s)bytes | strbytesถอดรหัส Base64 แบบ URL-safe รับทั้งอินพุตที่มีและไม่มี padding
encodebytes(s)bytesbytesMIME Base64: แทรก \n ทุก 76 อักขระและเพิ่ม \n ท้าย สำหรับ email/MIME เท่านั้น
decodebytes(s)bytesbytesถอดรหัส MIME Base64 เพิกเฉยช่องว่างและขึ้นบรรทัดใหม่ที่ฝังอยู่
b16encode(s)bytesbytesการเข้ารหัส hex (Base16) แต่ละ byte กลายเป็นอักขระ hex ตัวพิมพ์ใหญ่ 2 ตัว ไม่มี padding
b32encode(s)bytesbytesการเข้ารหัส Base32 ใช้ A–Z และ 2–7 เอาต์พุตใหญ่กว่า Base64 ใช้ใน TOTP secret

พารามิเตอร์ altchars ใน b64encode รับออบเจกต์ 2 byte ที่ แทนอักขระ + และ / การส่ง altchars=b'-_' สร้างเอาต์พุต เหมือนกับ urlsafe_b64encode แต่ให้ควบคุม padding แยกกันได้

Base64 แบบ URL-Safe — urlsafe_b64encode() สำหรับ JWT และ Query Parameter

Base64 มาตรฐานใช้ + และ / ซึ่งทั้งคู่เป็น reserved character ใน URL + ใน query string จะถูก decode เป็น ช่องว่าง และ / คือตัวคั่น path เมื่อค่าที่เข้ารหัส ปรากฏใน URL, ชื่อไฟล์หรือ cookie คุณต้องใช้ variant แบบ URL-safe: urlsafe_b64encode() แทน - สำหรับ + และ _ สำหรับ /

JWT ใช้ Base64 แบบ URL-safe โดยไม่มี padding สำหรับทุก segment ทั้งสาม (header, payload, signature) ต้องลบ padding ด้วยตนเอง — stdlib ของ Python เก็บไว้

เข้ารหัส payload segment ของ JWT

Python 3.6+
import base64
import json

def encode_jwt_segment(data: dict) -> str:
    """เข้ารหัส dict เป็น URL-safe Base64 string โดยไม่มี padding (รูปแบบ JWT)"""
    json_bytes = json.dumps(data, separators=(",", ":")).encode("utf-8")
    return base64.urlsafe_b64encode(json_bytes).rstrip(b"=").decode("ascii")

def decode_jwt_segment(segment: str) -> dict:
    """ถอดรหัส URL-safe Base64 JWT segment (จัดการ padding ที่หายไป)"""
    # เพิ่ม padding กลับ: Base64 ต้องการให้ความยาวเป็นทวีคูณของ 4
    padding  = 4 - len(segment) % 4
    padded   = segment + ("=" * (padding % 4))
    raw      = base64.urlsafe_b64decode(padded)
    return json.loads(raw)

# สร้าง JWT header และ payload
header  = {"alg": "HS256", "typ": "JWT"}
payload = {
    "sub":       "usr_7c3a9f1b2d",
    "workspace": "ws_eu-west-1-prod",
    "role":      "data-engineer",
    "iat":       1741824000,
    "exp":       1741910400,
}

header_segment  = encode_jwt_segment(header)
payload_segment = encode_jwt_segment(payload)

print(header_segment)
# eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

print(payload_segment)
# eyJzdWIiOiJ1c3JfN2MzYTlmMWIyZCIsIndvcmtzcGFjZSI6IndzX2...

# ตรวจสอบ round-trip
restored = decode_jwt_segment(payload_segment)
print(restored["role"])  # data-engineer
หมายเหตุ:urlsafe_b64decode() รับอินพุตทั้งที่มีและไม่มี padding ตั้งแต่ Python 3.x แต่เฉพาะเมื่อ อักขระ เป็น URL-safe (- และ _) ห้าม ส่ง string Base64 มาตรฐาน (ที่มี + หรือ /) ให้ urlsafe_b64decode — อักขระที่ไม่ตรงกันจะทำให้ เกิดข้อมูลเสียหายแบบเงียบๆ หรือ binascii.Error

การเข้ารหัสไฟล์และการตอบกลับ API ใน Python

ในโค้ด production การเข้ารหัส Base64 มักปรากฏรอบๆ ไฟล์ที่กำลังส่งและรอบๆ การตอบกลับ จาก API ภายนอกที่ส่งเนื้อหาไบนารี ทั้งสองสถานการณ์ต้องจัดการ bytes boundary อย่างระมัดระวัง

อ่านไฟล์จากดิสก์และเข้ารหัส

Python 3.6+
import base64
import json
from pathlib import Path

def encode_file_to_base64(file_path: str) -> str:
    """อ่านไฟล์ไบนารีและคืนการแทนค่าที่เข้ารหัส Base64"""
    try:
        raw_bytes = Path(file_path).read_bytes()
        return base64.b64encode(raw_bytes).decode("ascii")
    except FileNotFoundError:
        raise FileNotFoundError(f"ไม่พบไฟล์: {file_path}")
    except PermissionError:
        raise PermissionError(f"ปฏิเสธสิทธิ์การอ่าน: {file_path}")

# แนบ TLS certificate กับ deployment manifest
cert_b64 = encode_file_to_base64("./ssl/service-client.crt")

deployment_manifest = {
    "service":     "payment-processor",
    "environment": "production",
    "region":      "eu-west-1",
    "tls": {
        "client_cert":     cert_b64,
        "cert_format":     "base64-pem",
    },
}

# เขียน manifest — certificate ฝังอย่างปลอดภัยเป็น string
with open("./dist/deployment-manifest.json", "w") as f:
    json.dump(deployment_manifest, f, indent=2)

print(f"เข้ารหัส certificate แล้ว: {len(cert_b64)} อักขระ")

เข้ารหัสการตอบกลับ HTTP API สำหรับการ debug

Python 3.6+
import base64
import requests  # pip install requests

def fetch_and_encode_binary(url: str, headers: dict | None = None) -> str:
    """ดึงทรัพยากรไบนารีจาก API และคืนเป็น Base64"""
    response = requests.get(url, headers=headers or {}, timeout=10)
    response.raise_for_status()  # raise HTTPError สำหรับ 4xx/5xx

    content_type = response.headers.get("Content-Type", "unknown")
    encoded      = base64.b64encode(response.content).decode("ascii")

    print(f"Content-Type : {content_type}")
    print(f"ขนาดดิบ     : {len(response.content):,} bytes")
    print(f"ขนาดเข้ารหัส: {len(encoded):,} อักขระ")
    return encoded

# ตัวอย่าง: ดาวน์โหลดใบแจ้งหนี้ PDF ที่เซ็นชื่อจาก billing API ภายใน
invoice_b64 = fetch_and_encode_binary(
    "https://billing.internal/api/v2/invoices/INV-2026-0042/pdf",
    headers={"Authorization": "Bearer eyJhbGc..."},
)

# แนบกับ notification payload
notification = {
    "recipient_id":  "team-finance",
    "invoice_id":    "INV-2026-0042",
    "attachment": {
        "filename":     "invoice-2026-0042.pdf",
        "content":      invoice_b64,
        "content_type": "application/pdf",
        "encoding":     "base64",
    },
}
print(f"Payload พร้อมแล้ว: {len(str(notification)):,} อักขระ")

วิธีเข้ารหัสไฟล์รูปภาพ Base64 ใน Python

การเข้ารหัสรูปภาพเป็น Base64 และฝังเป็น data URI เป็นแนวทางมาตรฐานสำหรับ HTML email template, การสร้าง PDF และ HTML snapshot แบบพึ่งตนเอง เบราว์เซอร์แปล string ที่เข้า รหัสแล้วโดยตรง — ไม่จำเป็นต้องขอรูปภาพแยก รูปแบบเดียวกันใช้ได้กับไฟล์ไบนารีทุก ประเภท: PNG, JPEG, SVG, WebP หรือ PDF

Python 3.6+
import base64
import mimetypes
from pathlib import Path

def image_to_data_uri(image_path: str) -> str:
    """แปลงไฟล์รูปภาพเป็น Base64 data URI สำหรับการฝัง HTML แบบ inline"""
    path      = Path(image_path)
    mime_type = mimetypes.guess_type(image_path)[0] or "image/octet-stream"
    raw_bytes = path.read_bytes()
    encoded   = base64.b64encode(raw_bytes).decode("ascii")
    return f"data:{mime_type};base64,{encoded}"

# ฝังรูปภาพสินค้าแบบ inline ใน HTML email template
hero_uri      = image_to_data_uri("./assets/product-hero-768px.png")
thumbnail_uri = image_to_data_uri("./assets/product-thumb-128px.webp")

html_fragment = f"""
<img src="{hero_uri}"
     alt="ภาพหลักสินค้า"
     width="768" height="432"
     style="display:block;max-width:100%" />
"""

print(f"PNG data URI เริ่มต้นด้วย: {hero_uri[:60]}...")
# data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAwAAAAA...
หมายเหตุ:สำหรับไฟล์ SVG data URI ที่มี URL-encoding (data:image/svg+xml,{encoded}) มักเล็กกว่า Base64 เพราะ SVG เป็นข้อความและ Base64 เพิ่มขนาด ~33% ใช้ Base64 สำหรับรูปแบบ raster (PNG, JPEG, WebP) และ URL-encoding สำหรับ SVG

การทำงานกับไฟล์ขนาดใหญ่ — Chunked Base64 Encoding

การโหลดทั้งไฟล์เข้าหน่วยความจำด้วย Path.read_bytes() ใช้ได้สำหรับไฟล์ ถึง ~50 MB เหนือขีดจำกัดนั้น การใช้หน่วยความจำสูงสุดจะมีนัยสำคัญ — ไฟล์ 200 MB ต้องการ ~200 MB สำหรับ raw byte บวก ~267 MB สำหรับ Base64 output รวม ~467 MB ใน กระบวนการเดียว สำหรับไฟล์ขนาดใหญ่ ให้อ่านและเข้ารหัสเป็น chunk

ข้อจำกัดสำคัญ: ขนาด chunk ต้องเป็น ทวีคูณของ 3 bytes Base64 เข้ารหัส 3 byte อินพุตเป็น 4 อักขระเอาต์พุตพอดี หาก chunk boundary ตกที่ตำแหน่ง ที่ไม่ใช่ทวีคูณของ 3 ตัวเข้ารหัสจะเพิ่มอักขระ padding = กลางกระแส ทำให้เอาต์พุตที่ ต่อกันไม่ถูกต้อง

Streaming encode ไปยังไฟล์ (ไม่โหลดทั้งไฟล์เข้าหน่วยความจำ)

Python 3.6+
import base64
from pathlib import Path

CHUNK_SIZE = 3 * 1024 * 256  # 786,432 bytes — ทวีคูณของ 3, ~768 KB ต่อ chunk

def encode_large_file(input_path: str, output_path: str) -> int:
    """
    เข้ารหัสไฟล์ไบนารีขนาดใหญ่เป็น Base64 โดยไม่โหลดทั้งหมดเข้าหน่วยความจำ
    คืนจำนวนอักขระ Base64 ที่เขียน
    """
    total_chars = 0
    with open(input_path, "rb") as src, open(output_path, "w") as dst:
        while True:
            chunk = src.read(CHUNK_SIZE)
            if not chunk:
                break
            encoded_chunk = base64.b64encode(chunk).decode("ascii")
            dst.write(encoded_chunk)
            total_chars += len(encoded_chunk)
    return total_chars

# เข้ารหัสวิดีโอสินค้า 300 MB สำหรับ asset delivery manifest
chars_written = encode_large_file(
    "./uploads/product-demo-4k.mp4",
    "./dist/product-demo-4k.b64",
)
print(f"เข้ารหัสแล้ว: {chars_written:,} อักขระ Base64")
# เข้ารหัสแล้ว: 407,374,184 อักขระ Base64

เข้ารหัสไดเรกทอรี binary asset (เอาต์พุต NDJSON)

Python 3.6+
import base64
import json
from pathlib import Path

def encode_assets_to_ndjson(asset_dir: str, output_path: str) -> int:
    """
    เข้ารหัสไฟล์ไบนารีทั้งหมดในไดเรกทอรีเป็น NDJSON manifest
    แต่ละบรรทัดคือ JSON object: {"path": "...", "mime": "...", "data": "<base64>"}
    คืนจำนวนไฟล์ที่ประมวลผล
    """
    import mimetypes

    asset_path = Path(asset_dir)
    count = 0

    with open(output_path, "w") as out:
        for file_path in sorted(asset_path.rglob("*")):
            if not file_path.is_file():
                continue
            mime = mimetypes.guess_type(str(file_path))[0] or "application/octet-stream"
            encoded = base64.b64encode(file_path.read_bytes()).decode("ascii")
            record  = {"path": str(file_path.relative_to(asset_path)), "mime": mime, "data": encoded}
            out.write(json.dumps(record) + "\n")
            count += 1

    return count

processed = encode_assets_to_ndjson("./dist/static/", "./dist/asset-bundle.ndjson")
print(f"เข้ารหัส {processed} ไฟล์เป็น NDJSON asset bundle")
หมายเหตุ:สลับจาก read_bytes() ไปเป็นการอ่านแบบ chunk เมื่อไฟล์อินพุตเกิน ~50–100 MB หรือเมื่อบริการของคุณประมวลผลหลายไฟล์พร้อมกันและ memory pressure กลายเป็นความกังวล สำหรับไฟล์ใต้ 50 MB one-liner ที่เรียบง่ายกว่า b64encode(path.read_bytes()).decode() เร็วกว่าและ เข้าใจง่ายกว่า

การเข้ารหัส Base64 แบบ Command-Line ด้วย Python

Python มาพร้อม CLI interface สำหรับโมดูล base64 — ไม่ต้องใช้เครื่องมือเพิ่มเติม ทำงานข้ามแพลตฟอร์ม มีประโยชน์ใน CI pipeline และสภาพแวดล้อม Windows ที่คำสั่งระบบ base64 อาจไม่มี

bash
# ── python -m base64 ───────────────────────────────────────────────────
# เข้ารหัส string (pipe stdin)
echo -n "deploy-svc:sk-prod-9f2a1c3e8b4d" | python3 -m base64
# ZGVwbG95LXN2Yzpzay1wcm9kLTlmMmExYzNlOGI0ZA==

# เข้ารหัสไฟล์
python3 -m base64 ./ssl/service-client.crt

# ถอดรหัส Base64 string
echo "ZGVwbG95LXN2Yzpzay1wcm9kLTlmMmExYzNlOGI0ZA==" | python3 -m base64 -d

# ถอดรหัสไฟล์ Base64 กลับเป็นไบนารี
python3 -m base64 -d ./dist/service-client.b64 > ./restored.crt

# ── Python one-liner — ข้ามแพลตฟอร์ม ทำงานบน Windows ────────────────
# เข้ารหัส string
python3 -c "import base64,sys; print(base64.b64encode(sys.argv[1].encode()).decode())" "my-secret"
# bXktc2VjcmV0

# เข้ารหัสแบบ URL-safe (ไม่มี padding)
python3 -c "import base64,sys; print(base64.urlsafe_b64encode(sys.argv[1].encode()).rstrip(b'=').decode())" "my-secret"
# bXktc2VjcmV0

# เข้ารหัสไฟล์แบบ inline (ผลลัพธ์บน stdout)
python3 -c "import base64,sys; print(base64.b64encode(open(sys.argv[1],'rb').read()).decode())" ./config.json
หมายเหตุ:ต่างจากคำสั่งระบบ macOS base64, python -m base64 ไม่ตัดบรรทัดเอาต์พุตที่ 76 อักขระตามค่าเริ่มต้น เอาต์พุตเป็นบรรทัดเดียวไม่ขาดตอน ซึ่งเป็นสิ่งที่คุณต้องการ สำหรับ environment variable, JSON field และ HTTP header ใช้แทนระบบ base64 บน OS ใดก็ได้

ทางเลือกที่มีประสิทธิภาพสูง: pybase64

โมดูล stdlib base64 ของ Python ถูก implement ด้วย pure Python (มี C layer บางๆ ใน CPython) สำหรับบริการที่เข้ารหัส payload ขนาดใหญ่ด้วย throughput สูง — image processing pipeline, bulk export job, real-time telemetry ingestion — pybase64 เป็นตัวแทน drop-in ที่รองรับ โดย libbase64 ซึ่งเป็นไลบรารี C ที่เร่งด้วย SIMD Benchmark แสดงการปรับปรุง throughput 2–10 เท่า ขึ้นอยู่กับขนาด payload และสถาปัตยกรรม CPU

bash
pip install pybase64
Python 3.6+
import pybase64
import time

# pybase64 เป็นตัวแทน drop-in — ลายเซ็นฟังก์ชันเหมือนกับ stdlib
sample_payload = b"x" * (1024 * 1024)  # 1 MB ข้อมูลไบนารี

# การเข้ารหัสมาตรฐาน — เอาต์พุตเหมือนกับ base64.b64encode()
encoded = pybase64.b64encode(sample_payload)
decoded = pybase64.b64decode(encoded)
assert decoded == sample_payload

# การเข้ารหัสแบบ URL-safe — เอาต์พุตเหมือนกับ base64.urlsafe_b64encode()
url_safe = pybase64.urlsafe_b64encode(sample_payload)

# b64encode_as_string() คืน str โดยตรง — ไม่ต้องเรียก .decode()
telemetry_event = b'{"event":"page_view","session_id":"sess_3a7f91c2","ts":1741824000}'
encoded_str: str = pybase64.b64encode_as_string(telemetry_event)

print(encoded_str[:48] + "...")
# eyJldmVudCI6InBhZ2VfdmlldyIsInNlc3Npb25faWQi...

# การเปรียบเทียบ throughput (โดยประมาณ ขึ้นอยู่กับฮาร์ดแวร์)
# stdlib  base64.b64encode(1 MB):   ~80 MB/s
# pybase64.b64encode(1 MB):         ~800 MB/s (เส้นทาง SIMD บน CPU AVX2)

สลับไปใช้ pybase64 เมื่อ profiling แสดงว่าการเข้ารหัส Base64 เป็น bottleneck หรือเมื่อคุณเข้ารหัส payload เกิน ~100 KB ซ้ำๆ สำหรับการเข้ารหัส string เล็กๆ แบบครั้งเดียว (credential, token) stdlib เร็วพอและไม่มี dependency ที่ต้องติดตั้ง

เอาต์พุต Terminal พร้อม Syntax Highlighting

เมื่อ debug payload ที่เข้ารหัส Base64 ใน terminal — โดยเฉพาะ JSON config หรือเนื้อหา JWT — ไลบรารี rich ให้เอาต์พุตที่มี syntax highlighting และ indent ที่อ่านง่ายกว่าการ dump ดิบมาก มีประโยชน์เป็นพิเศษ ใน CLI tool, debug script และ REPL session

bash
pip install rich
Python 3.6+
import base64
import json
from rich import print as rprint
from rich.syntax import Syntax
from rich.console import Console

console = Console()

def decode_and_pretty_print(encoded: str, label: str = "Payload ที่ถอดรหัส") -> None:
    """ถอดรหัส Base64 string, parse เป็น JSON และพิมพ์พร้อม syntax highlighting"""
    raw_bytes = base64.b64decode(encoded + "==")  # tolerant padding
    try:
        parsed  = json.loads(raw_bytes)
        pretty  = json.dumps(parsed, indent=2, ensure_ascii=False)
        syntax  = Syntax(pretty, "json", theme="monokai", line_numbers=False)
        console.rule(f"[bold blue]{label}")
        console.print(syntax)
    except json.JSONDecodeError:
        # ไม่ใช่ JSON — พิมพ์ข้อความดิบ
        console.rule(f"[bold yellow]{label} (ข้อความดิบ)")
        rprint(raw_bytes.decode("utf-8", errors="replace"))

# ตรวจสอบ JWT payload segment จาก request การยืนยันตัวตนที่ล้มเหลว
jwt_payload_segment = "eyJzdWIiOiJ1c3JfN2MzYTlmMWIyZCIsInJvbGUiOiJkYXRhLWVuZ2luZWVyIiwiZXhwIjoxNzQxOTEwNDAwfQ"
decode_and_pretty_print(jwt_payload_segment, "JWT Payload")
หมายเหตุ:ใช้เอาต์พุต rich เฉพาะสำหรับการแสดงผล terminal — สำหรับ debug, logging ไปยัง stdout หรือ CLI tool แบบ interactive ห้ามใช้เพื่อเขียน Base64 output ไปยังไฟล์, คืนจาก API endpoint หรือเก็บใน environment variable เพราะ rich เพิ่ม ANSI escape code ที่ทำให้ข้อมูลเสียหาย

ข้อผิดพลาดทั่วไป

ฉัน review codebase Python ที่มีการเข้ารหัส Base64 มามาก และข้อผิดพลาด 4 ข้อนี้ปรากฏ อย่างสม่ำเสมอ — มักไม่ถูกค้นพบจนกว่าอินพุต non-ASCII หรือไฟล์ไบนารีจะผ่านเส้นทาง การเข้ารหัสใน production

ข้อผิดพลาด 1 — ส่ง str แทน bytes ให้ b64encode()

ปัญหา: b64encode() ต้องการออบเจกต์ bytes การส่ง str จะ raise TypeError: a bytes-like object is required ทันที แก้ไข: เรียก .encode("utf-8") บน string ก่อนเข้ารหัสเสมอ

Before · Python
After · Python
import base64

# ❌ TypeError: a bytes-like object is required, not 'str'
webhook_secret = "wh-secret-a3f91c2b4d"
encoded = base64.b64encode(webhook_secret)  # crash
import base64

# ✅ เข้ารหัส str เป็น bytes ก่อน
webhook_secret = "wh-secret-a3f91c2b4d"
encoded = base64.b64encode(webhook_secret.encode("utf-8"))
# b'd2gtc2VjcmV0LWEzZjkxYzJiNGQ='

ข้อผิดพลาด 2 — ลืมเรียก .decode() บนผลลัพธ์ bytes

ปัญหา: b64encode() คืน bytes ไม่ใช่ str การฝังโดยตรงใน f-string สร้าง b'...' ในเอาต์พุต ซึ่งเป็น ค่า HTTP header ที่ไม่ถูกต้องและทำให้ JSON serialisation ล้มเหลว แก้ไข: เรียก .decode("ascii") บนผลลัพธ์ ที่เข้ารหัสเสมอ

Before · Python
After · Python
import base64

credential = base64.b64encode(b"svc-monitor:sk-7f3a1b")
# ❌ Authorization header มี "b'c3ZjLW1vbml0b3I6c2stN2YzYTFi'"
headers = {"Authorization": f"Basic {credential}"}
import base64

credential = base64.b64encode(b"svc-monitor:sk-7f3a1b").decode("ascii")
# ✅ Authorization: Basic c3ZjLW1vbml0b3I6c2stN2YzYTFi
headers = {"Authorization": f"Basic {credential}"}

ข้อผิดพลาด 3 — ใช้ encodebytes() ที่ต้องการ b64encode()

ปัญหา: encodebytes() แทรก \n ทุก 76 อักขระ (MIME line-wrapping) และเพิ่มขึ้นบรรทัดใหม่ท้าย การเก็บสิ่งนี้ใน JSON field, environment variable หรือ data URI จะฝังอักขระขึ้นบรรทัดใหม่จริงๆ ที่ทำให้ค่าถัดไปเสียหาย แก้ไข: ใช้ b64encode() ทุกที่ยกเว้น MIME email composition

Before · Python
After · Python
import base64, json

cert_bytes = open("./ssl/root-ca.crt", "rb").read()
# ❌ encodebytes() เพิ่ม \n ทุก 76 chars — ทำให้ JSON และ env vars เสียหาย
cert_b64 = base64.encodebytes(cert_bytes).decode()
config   = json.dumps({"ca_cert": cert_b64})  # มีขึ้นบรรทัดใหม่ใน string value
import base64, json
from pathlib import Path

cert_bytes = Path("./ssl/root-ca.crt").read_bytes()
# ✅ b64encode() สร้าง string เดี่ยวไม่ขาดตอน
cert_b64 = base64.b64encode(cert_bytes).decode("ascii")
config   = json.dumps({"ca_cert": cert_b64})  # ค่าบรรทัดเดียวที่สะอาด

ข้อผิดพลาด 4 — ถอดรหัส URL-safe Base64 ด้วย decoder มาตรฐาน

ปัญหา: URL-safe Base64 ใช้ - และ _ แทน + และ / การส่ง URL-safe string ให้ b64decode() จะสร้าง bytes ที่ผิดอย่าง เงียบๆ สำหรับ segment ใดก็ตามที่มีอักขระเหล่านั้น — ไม่มี exception ถูก raise ตามค่าเริ่มต้น แก้ไข: ใช้ urlsafe_b64decode() สำหรับอินพุต URL-safe หรือส่ง validate=True เพื่อตรวจจับความไม่ ตรงกันแต่เนิ่นๆ

Before · Python
After · Python
import base64

# ❌ JWT payload segment ใช้ URL-safe Base64 (- และ _)
# b64decode() สร้าง bytes ที่ผิดอย่างเงียบๆ สำหรับอักขระเหล่านั้น
jwt_segment = "eyJzdWIiOiJ1c3JfN2MzYTlmMWIyZCIsInJvbGUiOiJhZG1pbiJ9"
wrong = base64.b64decode(jwt_segment)  # ผิดเงียบๆ ถ้ามี - หรือ _
import base64

# ✅ ใช้ urlsafe_b64decode() สำหรับ JWT และอินพุต URL-safe
jwt_segment = "eyJzdWIiOiJ1c3JfN2MzYTlmMWIyZCIsInJvbGUiOiJhZG1pbiJ9"
padding     = 4 - len(jwt_segment) % 4
raw         = base64.urlsafe_b64decode(jwt_segment + "=" * (padding % 4))
# b'{"sub":"usr_7c3a9f1b2d","role":"admin"}'

Python Base64 Method — การเปรียบเทียบอย่างรวดเร็ว

เมธอดประเภทอินพุตอักขระ URL-safeการเติม Paddingการขึ้นบรรทัดใหม่ค่าที่คืนต้องติดตั้ง
b64encode()bytes, bytearray, memoryview❌ + และ /✅ = padding❌ ไม่มีbytesไม่
urlsafe_b64encode()bytes, bytearray, memoryview✅ - และ _✅ = padding❌ ไม่มีbytesไม่
b64encode(altchars=b"-_")bytes, bytearray, memoryview✅ 2 อักขระกำหนดเอง✅ = padding❌ ไม่มีbytesไม่
encodebytes()bytes, bytearray, memoryview❌ + และ /✅ = padding✅ \n ทุก 76 อักขระbytesไม่
pybase64.b64encode()bytes, bytearray, memoryview❌ + และ /✅ = padding❌ ไม่มีbytespip install
pybase64.b64encode_as_string()bytes, bytearray, memoryview❌ + และ /✅ = padding❌ ไม่มีstrpip install

เลือก b64encode() สำหรับกรณีใช้งานส่วน ใหญ่: HTTP header, JSON field, environment variable และ data URI สลับไปใช้ urlsafe_b64encode() เมื่อเอาต์พุตจะ ปรากฏใน URL, ชื่อไฟล์, cookie หรือ JWT segment ใช้ encodebytes() เฉพาะเมื่อแต่งไฟล์แนบ MIME email — การตัดบรรทัดบังคับตาม MIME spec แต่จะทำให้ทุกอย่างอื่นเสียหายอย่าง เงียบๆ ใช้ pybase64 เมื่อเข้ารหัส payload เกิน ~100 KB ใน hot path

คำถามที่พบบ่อย

ทำไม base64.b64encode() จึงคืน bytes แทน string?
Python 3 แยก text (str) และ binary data (bytes) อย่างเคร่งครัด base64.b64encode() ทำงานบน binary data และคืน binary data — แม้ว่าอักขระเอาต์พุตจะเป็น printable ASCII การออกแบบนี้จงใจ: บังคับให้คุณชัดเจนเกี่ยวกับขอบเขต encoding เพื่อรับ str ให้เรียก .decode("ascii") หรือ .decode("utf-8") บนผลลัพธ์ เนื่องจาก Base64 output ที่ถูกต้องมีเฉพาะ ASCII character ทั้งสอง encoding จึงให้ผลลัพธ์เหมือนกัน
ความแตกต่างระหว่าง b64encode() และ encodebytes() ใน Python คืออะไร?
b64encode() สร้าง Base64 string เดี่ยวไม่ขาดตอน — ตัวเลือกที่ถูกต้องสำหรับ HTTP header, JSON field, data URI, environment variable และ JWT segment encodebytes() (เดิมคือ encodestring() ใน Python 2) แทรก newline character ทุก 76 byte และเพิ่ม newline ท้าย นี่คือรูปแบบ MIME line-wrapping ที่บังคับสำหรับ email attachment ตาม RFC 2045 การใช้ encodebytes() นอกการแต่ง email จะฝัง newline จริงๆ ในเอาต์พุต ทำให้ header, JSON string และค่า URL เสียหาย
จะเข้ารหัส base64 string ที่มีอักขระ non-ASCII ใน Python ได้อย่างไร?
เรียก .encode("utf-8") บน string เพื่อแปลงเป็น bytes จากนั้นส่ง bytes นั้นให้ base64.b64encode() เพื่อถอดรหัสให้ย้อนขั้นตอน: base64.b64decode(encoded) จากนั้น .decode("utf-8") บนผลลัพธ์ UTF-8 เป็นตัวเลือกที่ถูกต้องสำหรับข้อความส่วนใหญ่ — จัดการทุก Unicode code point รวมถึง Cyrillic, CJK ideograph, อาหรับและ emoji การใช้ .encode("ascii") บนข้อความ non-ASCII จะ raise UnicodeEncodeError ซึ่งมักเป็นพฤติกรรมที่ถูกต้องเพราะค้นพบ encoding mismatch แต่เนิ่นๆ
จะเข้ารหัส base64 ไฟล์ใน Python ได้อย่างไร?
อ่านไฟล์ในโหมดไบนารี จากนั้นเรียก base64.b64encode() บน bytes one-liner ที่ง่ายที่สุดคือ: encoded = base64.b64encode(Path("file.bin").read_bytes()).decode("ascii") สำหรับไฟล์ขนาดใหญ่ (เกิน ~50–100 MB) หลีกเลี่ยงการโหลดทั้งไฟล์เข้าหน่วยความจำ แทนที่อ่านเป็น chunk ที่มีขนาดเป็นทวีคูณของ 3 bytes (เช่น 3 × 1024 × 256 = 786,432 bytes) และเข้ารหัสแต่ละ chunk แยกกัน — ขนาด chunk ที่เป็นทวีคูณของ 3 หลีกเลี่ยงอักขระ padding = ที่ไม่ต้องการปรากฏกลางเอาต์พุต
ทำไม urlsafe_b64encode() ของ Python ยังมี padding = อยู่? JWT ไม่ใช้มัน
stdlib ปฏิบัติตาม RFC 4648 §5 specification ที่คง padding = ไว้ JWT (RFC 7519) กำหนด Base64url encoding ของตัวเองที่ลบ padding ออกทั้งหมด ความไม่ตรงกันนี้เป็นการตัดสินใจ spec ที่จงใจ: padding RFC 4648 ทำให้ string บอกตัวเองได้ (คุณสามารถกำหนดความยาว byte ต้นฉบับได้เสมอ) ขณะที่ JWT ลบออกเพื่อลดความยาว token เพื่อให้ตรงกับรูปแบบ JWT เรียก .rstrip(b"=") บนเอาต์พุตที่เข้ารหัสก่อน decode ด้วย .decode("ascii") เมื่อ decode ให้เพิ่ม padding กลับ: padding = 4 - len(segment) % 4; padded = segment + "=" * (padding % 4)
มีวิธีตรวจสอบว่า string เป็น Base64 ที่ถูกต้องก่อน decode หรือไม่?
ส่ง validate=True ให้ base64.b64decode() ด้วย flag นี้ อักขระใดก็ตามนอก Base64 alphabet มาตรฐาน (A–Z, a–z, 0–9, +, /, =) จะ raise binascii.Error โดยไม่มี validate=True, b64decode() จะเพิกเฉยต่ออักขระที่ไม่ถูกต้องอย่างเงียบๆ ซึ่งอาจซ่อนอินพุตที่เสียหาย สำหรับ URL-safe Base64 ไม่มีพารามิเตอร์ validate ใน urlsafe_b64decode() — คุณสามารถตรวจสอบด้วย regex ด้วยตนเอง: import re; bool(re.fullmatch(r"[A-Za-z0-9_-]+=*", segment)) ตรวจสอบอินพุตจากแหล่งภายนอกที่ไม่น่าเชื่อถือก่อน decode เสมอ

เครื่องมือที่เกี่ยวข้อง

สำหรับการ encode หรือ decode แบบ one-click โดยไม่ต้องเขียน Python ให้วาง string หรือไฟล์ของคุณโดยตรงใน เครื่องมือเข้ารหัส Base64 — จัดการทั้งโหมดมาตรฐานและ URL-safe ได้ทันทีในเบราว์เซอร์ของคุณ ไม่ต้องตั้งค่า

มีให้ในภาษาอื่นด้วย:JavaScriptJava
MS
Maria SantosBackend Developer

Maria is a backend developer specialising in Python and API integration. She has broad experience with data pipelines, serialisation formats, and building reliable server-side services. She is an active member of the Python community and enjoys writing practical, example-driven guides that help developers solve real problems without unnecessary theory.

PS
Priya Sharmaผู้ตรวจสอบทางเทคนิค

Priya is a data scientist and machine learning engineer who has worked across the full Python data stack — from raw data ingestion and cleaning to model deployment and monitoring. She is passionate about reproducible research, Jupyter-based workflows, and the practical engineering side of ML. She writes about NumPy, Pandas, data serialisation, and the Python patterns that make data pipelines reliable at scale.