Base64 декодування Python — b64decode()

·Backend Developer·ПеревіреноDmitri Volkov·Опубліковано

Використовуйте безкоштовний Base64 Decode Online прямо в браузері — без встановлення.

Спробувати Base64 Decode Online онлайн →

Коли API повертає поле content вигляду eyJob3N0IjogImRiLXByb2Qi…, або менеджер секретів передає закодовані облікові дані, або потрібно витягти корисне навантаження JWT — декодування Base64 у Python є вашим першим інструментом. Вбудований модуль base64 справляється з усім цим, однак тонкощі роботи з bytes і рядками, URL-безпечними алфавітами та відсутнім педдінгом ловлять майже кожного розробника хоча б раз — я налагоджував цю категорію помилок на код-рев'ю більше разів, ніж хотів би визнавати. Цей посібник охоплює base64.b64decode(), urlsafe_b64decode(), автоматичне відновлення педдінгу, декодування з файлів і HTTP-відповідей, CLI-інструменти, валідацію вхідних даних і чотири поширені помилки з прикладами до/після — всі приклади працюють на Python 3.8+. Якщо потрібно швидко декодувати рядок без написання коду, Base64 Decoder від ToolDeck миттєво обробляє стандартний і URL-безпечний Base64 прямо у браузері.

  • base64.b64decode(s) вбудований у стандартну бібліотеку Python — встановлення не потрібне; функція завжди повертає bytes, а не str.
  • Щоб перетворити bytes на рядок Python, викличте .decode("utf-8") після b64decode() — функція не знає вихідне кодування тексту.
  • Для URL-безпечного Base64 (використовує - і _ замість + і /), застосовуйте base64.urlsafe_b64decode() — стандарт для JWT, токенів OAuth та облікових даних Google API.
  • Виправте поширену помилку "Incorrect padding" за допомогою: padded = s + "=" * (-len(s) % 4) — додає 0, 1 або 2 символи за потреби.
  • Використовуйте validate=True для будь-яких зовнішніх даних, щоб binascii.Error викликався при наявності неприпустимих символів, а не ігнорував їх мовчки.

Що таке декодування Base64?

Base64 — це схема кодування, що представляє довільні бінарні дані у вигляді рядка з 64 друкованих символів ASCII: A–Z, a–z, 0–9, + і /, де = використовується як символ педдінгу. Кожні 4 символи Base64 кодують рівно 3 вихідних байти, тому закодована форма приблизно на 33% довша за оригінал. Декодування виконує зворотне перетворення — перетворює ASCII-представлення назад у вихідні байти.

Base64 не шифрує дані. Це виключно бінарно-текстове кодування — закодований рядок повністю читається будь-ким, хто пропустить його через декодер:

До — закодовано в Base64

eyJob3N0IjogImRiLXByb2QubXljb21wYW55LmludGVybmFsIiwgInBvcnQiOiA1NDMyLCAidXNlciI6ICJhcHBfc3ZjIn0=

Після — декодовано

{"host": "db-prod.mycompany.internal", "port": 5432, "user": "app_svc"}

base64.b64decode() — декодування через стандартну бібліотеку

Модуль base64 у Python постачається зі стандартною бібліотекою — нічого встановлювати не потрібно, він завжди доступний. Основна функція — base64.b64decode(s, altchars=None, validate=False). Вона приймає str, bytes або bytearray і завжди повертає bytes.

Мінімальний робочий приклад

Python 3.8+
import base64
import json

# Encoded database config received from a secrets manager
encoded_config = (
    "eyJob3N0IjogImRiLXByb2QubXljb21wYW55LmludGVybmFsIiwgInBvcnQiOiA1NDMyLCAid"
    "XNlciI6ICJhcHBfc3ZjIiwgInBhc3N3b3JkIjogInM0ZmVQYXNzITIwMjYifQ=="
)

# Step 1: decode Base64 bytes
raw_bytes = base64.b64decode(encoded_config)
print(raw_bytes)
# b'{"host": "db-prod.mycompany.internal", "port": 5432, "user": "app_svc", "password": "s4fePass!2026"}'

# Step 2: convert bytes → str
config_str = raw_bytes.decode("utf-8")

# Step 3: parse into a dict
config = json.loads(config_str)
print(config["host"])    # db-prod.mycompany.internal
print(config["port"])    # 5432
Примітка:b64decode() завжди повертає bytes — ніколи рядок. Якщо вихідні дані були текстом, викличте .decode("utf-8"). Якщо це бінарні дані (зображення, PDF, gzip-архів), залиште bytes як є і запишіть їх у файл або передайте безпосередньо до бібліотеки-споживача.

Розширений приклад: sort_keys, ensure_ascii та сувора валідація

Python 3.8+
import base64
import binascii

# Token from an internal event bus — validate strictly (external input)
encoded_event = (
    "eyJldmVudCI6ICJvcmRlci5zaGlwcGVkIiwgIm9yZGVyX2lkIjogIk9SRC04ODQ3MiIsICJ"
    "0aW1lc3RhbXAiOiAiMjAyNi0wMy0xM1QxNDozMDowMFoiLCAicmVnaW9uIjogImV1LXdlc3QtMSJ9"
)

try:
    # validate=True raises binascii.Error on any non-Base64 character
    raw = base64.b64decode(encoded_event, validate=True)
    event = raw.decode("utf-8")
    print(event)
    # {"event": "order.shipped", "order_id": "ORD-88472", "timestamp": "2026-03-13T14:30:00Z", "region": "eu-west-1"}

except binascii.Error as exc:
    print(f"Invalid Base64: {exc}")
except UnicodeDecodeError as exc:
    print(f"Not UTF-8 text: {exc}")

Декодування URL-безпечного Base64 (base64url)

Стандартний Base64 використовує + і /, які є зарезервованими символами в URL. URL-безпечний варіант (RFC 4648 §5, також відомий як “base64url”) замінює їх на - і _. Саме це кодування використовується в JWT-токенах, PKCE-запитах OAuth 2.0, облікових даних Google Cloud та більшості сучасних процесів веб-аутентифікації.

Передача URL-безпечного Base64 в b64decode() без зміни алфавіту призведе до непомітного пошкодження даних або виклику binascii.Error. Натомість використовуйте base64.urlsafe_b64decode() — він автоматично виконує заміну -+ і _/.

Python 3.8+
import base64
import json

# JWT payload segment (the middle part between the two dots)
# JWTs use URL-safe Base64 without trailing "=" padding
jwt_payload_b64 = (
    "eyJ1c2VyX2lkIjogMjg5MywgInJvbGUiOiAiYWRtaW4iLCAiaXNzIjogImF1dGgubXljb21w"
    "YW55LmNvbSIsICJleHAiOiAxNzQwOTAwMDAwLCAianRpIjogImFiYzEyMzQ1LXh5ei05ODc2In0"
)

# Restore padding before decoding (JWT deliberately omits '=')
padded = jwt_payload_b64 + "=" * (-len(jwt_payload_b64) % 4)

payload_bytes = base64.urlsafe_b64decode(padded)
payload = json.loads(payload_bytes.decode("utf-8"))

print(payload["role"])    # admin
print(payload["iss"])     # auth.mycompany.com
print(payload["user_id"]) # 2893
Примітка:Вираз "=" * (-len(s) % 4) додає рівно 0, 1 або 2 символи педдінгу за потреби і є холостою операцією, коли рядок вже правильно доповнений. Це ідіоматичне Python-рішення для проблем із педдінгом у JWT та OAuth.

Довідник параметрів base64.b64decode()

Усі параметри нижче застосовуються як до b64decode(), так і до urlsafe_b64decode(), за винятком altchars, який доступний лише в b64decode().

ПараметрТипЗа замовчуваннямОпис
sbytes | str | bytearrayЗакодований у Base64 вхідний потік для декодування; ASCII str приймається нарівні з байтовими типами.
altcharsbytes | NoneNoneПослідовність із 2 байт, що замінює + і /; дозволяє використовувати нестандартні алфавіти Base64, що виходять за рамки URL-безпечного варіанту.
validateboolFalseПри значенні True викликає binascii.Error для будь-якого символу за межами алфавіту Base64; при False байти не з алфавіту (переноси рядків, пробіли) мовчки ігноруються.

Значення validate=False за замовчуванням навмисно передбачене для PEM-форматованих даних і багаторядкового Base64 (де переноси рядків часті). Для API-навантажень, завантажень користувачів або будь-яких ненадійних вхідних даних передавайте validate=True, щоб зловити пошкоджені або впроваджені дані на ранньому етапі й отримати зрозуміле повідомлення про помилку.

Помилка педдінгу при декодуванні Base64 у Python — як виправити

Найпоширеніша помилка при декодуванні Base64 у Python:

Python 3.8+
import base64

base64.b64decode("eyJ0eXBlIjogImFjY2VzcyJ9")
# binascii.Error: Incorrect padding

Base64 вимагає, щоб довжина рядка була кратна 4. Коли дані передаються через URL, HTTP-заголовки або JWT-бібліотеки, завершальний символ педдінгу =видаляється для економії байт. Є два надійних способи виправити це.

Варіант 1: відновлення педдінгу інлайн (рекомендується)

Python 3.8+
import base64
import json

def b64decode_unpadded(data: str | bytes) -> bytes:
    """Decode Base64 with automatic padding correction."""
    if isinstance(data, str):
        data = data.encode("ascii")
    data += b"=" * (-len(data) % 4)
    return base64.b64decode(data)

# Works regardless of how many '=' were stripped
token_a = "eyJ0eXBlIjogImFjY2VzcyJ9"       # 0 chars of padding stripped
token_b = "eyJ0eXBlIjogInJlZnJlc2gifQ"      # 1 char stripped
token_c = "eyJ0eXBlIjogImFwaV9rZXkifQ=="    # already padded

for token in (token_a, token_b, token_c):
    result = json.loads(b64decode_unpadded(token).decode("utf-8"))
    print(result["type"])
# access
# refresh
# api_key

Варіант 2: URL-безпечне декодування з педдінгом для OAuth / JWT

Python 3.8+
import base64
import json

def decode_jwt_segment(segment: str) -> dict:
    """Decode a single JWT segment (header or payload)."""
    # Add padding, use URL-safe alphabet
    padded = segment + "=" * (-len(segment) % 4)
    raw = base64.urlsafe_b64decode(padded)
    return json.loads(raw.decode("utf-8"))

# Google OAuth ID token payload (simplified)
id_token_payload = (
    "eyJzdWIiOiAiMTEwNTY5NDkxMjM0NTY3ODkwMTIiLCAiZW1haWwiOiAic2FyYS5jaGVuQGV4"
    "YW1wbGUuY29tIiwgImhkIjogImV4YW1wbGUuY29tIiwgImlhdCI6IDE3NDA5MDAwMDB9"
)

claims = decode_jwt_segment(id_token_payload)
print(claims["email"])   # sara.chen@example.com
print(claims["hd"])      # example.com

Декодування Base64 з файлу та API-відповіді

Читання Base64 з диска та декодування API-навантажень — два найпоширеніші виробничі сценарії. Обидва потребують належної обробки помилок — пошкоджений педдінг і несподівані бінарні типи трапляються на практиці, а не в теорії.

Читання та декодування файлу Base64

Python 3.8+
import base64
import json
from pathlib import Path

def decode_attachment(envelope_path: str, output_path: str) -> None:
    """
    Read a JSON envelope with a Base64-encoded attachment,
    decode it, and write the binary output to disk.
    """
    try:
        envelope = json.loads(Path(envelope_path).read_text(encoding="utf-8"))
        encoded_data = envelope["attachment"]["data"]
        file_bytes = base64.b64decode(encoded_data, validate=True)
        Path(output_path).write_bytes(file_bytes)
        print(f"Saved {len(file_bytes):,} bytes → {output_path}")
    except FileNotFoundError:
        print(f"Envelope file not found: {envelope_path}")
    except (KeyError, TypeError):
        print("Unexpected envelope structure — 'attachment.data' missing")
    except base64.binascii.Error as exc:
        print(f"Invalid Base64 content: {exc}")

# Example envelope:
# {"attachment": {"filename": "invoice_2026_03.pdf", "data": "JVBERi0xLjQK..."}}
decode_attachment("order_ORD-88472.json", "invoice_2026_03.pdf")

Декодування Base64 з HTTP API-відповіді

Python 3.8+
import base64
import json
import urllib.request

def fetch_and_decode_secret(vault_url: str, secret_name: str) -> str:
    """
    Retrieve a Base64-encoded secret from an internal vault API
    and return the decoded plaintext value.
    """
    url = f"{vault_url}/v1/secrets/{secret_name}"
    req = urllib.request.Request(url, headers={"X-Vault-Token": "s.internal"})

    try:
        with urllib.request.urlopen(req, timeout=5) as resp:
            body = json.loads(resp.read().decode("utf-8"))
            # Vault returns: {"data": {"value": "<base64>", "encoding": "base64"}}
            encoded = body["data"]["value"]
            return base64.b64decode(encoded).decode("utf-8")

    except urllib.error.URLError as exc:
        raise RuntimeError(f"Vault unreachable: {exc}") from exc
    except (KeyError, UnicodeDecodeError, base64.binascii.Error) as exc:
        raise ValueError(f"Unexpected secret format: {exc}") from exc

# db_pass = fetch_and_decode_secret("https://vault.internal", "db-prod-password")
# print(db_pass)  # s4feP@ss!2026
Примітка:Якщо ви використовуєте бібліотеку requests, замініть urllib.request на resp = requests.get(url, timeout=5, headers=headers) і body = resp.json(). Логіка декодування Base64 залишається ідентичною.

Декодування Base64 через командний рядок

Для швидкої перевірки в терміналі — верифікації токена, перегляду закодованого конфігу або передачі API-виводу через декодер — команда base64 доступна в Linux і macOS. Вбудований Python-модуль -m base64 працює кросплатформно, включаючи Windows.

Bash
# Decode a Base64 string and print the result (Linux / macOS)
echo "eyJob3N0IjogImRiLXByb2QubXljb21wYW55LmludGVybmFsIn0=" | base64 --decode
# {"host": "db-prod.mycompany.internal"}

# Decode a file, save decoded output
base64 --decode encoded_payload.txt > decoded_output.json

# Python's cross-platform CLI decoder (works on Windows too)
python3 -m base64 -d encoded_payload.txt

# Decode a JWT payload segment inline — strip header/signature first
echo "eyJ1c2VyX2lkIjogMjg5MywgInJvbGUiOiAiYWRtaW4ifQ" | python3 -c "
import sys, base64, json
s = sys.stdin.read().strip()
padded = s + '=' * (-len(s) % 4)
print(json.dumps(json.loads(base64.urlsafe_b64decode(padded)), indent=2))
"

Для дослідницької роботи, коли написання командного конвеєра здається зайвим, вставте рядок в онлайн-декодер Base64 — він автоматично визначає URL-безпечний ввід і виправляє педдінг на льоту.

Валідація вхідних даних Base64 перед декодуванням

Коли дані Base64 надходять від користувацького введення, вебхука або ненадійного стороннього API, валідуйте їх перед декодуванням, щоб отримувати чисті зрозумілі помилки, а не заплутані трасування binascii.Error у глибині бізнес-логіки. Python пропонує два підходи: перехоплення виключень або попередня валідація за допомогою регулярних виразів.

Python 3.8+
import base64
import binascii
import re

# ── Option A: try/except (recommended for most code paths) ──────────────────

def safe_b64decode(data: str) -> bytes | None:
    """Return decoded bytes, or None if the input is not valid Base64."""
    try:
        padded = data + "=" * (-len(data) % 4)
        return base64.b64decode(padded, validate=True)
    except (binascii.Error, ValueError):
        return None

print(safe_b64decode("not-base64!!"))                     # None
print(safe_b64decode("eyJ0eXBlIjogInJlZnJlc2gifQ"))      # b'{"type": "refresh"}'


# ── Option B: regex pre-validation ──────────────────────────────────────────

# Standard Base64 (alphabet: A-Z a-z 0-9 + /)
_STANDARD_RE = re.compile(r"^[A-Za-z0-9+/]*={0,2}$")

# URL-safe Base64 (alphabet: A-Z a-z 0-9 - _)
_URLSAFE_RE = re.compile(r"^[A-Za-z0-9-_]*={0,2}$")

def is_valid_base64(s: str) -> bool:
    """True if s is a syntactically valid standard Base64 string."""
    # Length must be a multiple of 4 for fully padded strings
    stripped = s.rstrip("=")
    padded = stripped + "=" * (-len(stripped) % 4)
    return bool(_STANDARD_RE.match(padded))

print(is_valid_base64("SGVsbG8gV29ybGQ="))   # True
print(is_valid_base64("SGVsbG8gV29ybGQ!"))   # False  (! is not Base64)

Високопродуктивна альтернатива: pybase64

У переважній більшості випадків модуль base64 зі стандартної бібліотеки Python цілком достатній. Якщо ви обробляєте тисячі API-навантажень на секунду, декодуєте багатомегабайтні бінарні вкладення у щільному циклі, або профілювальник показує операції Base64 як вузьке місце — розгляньте pybase64. Це обгортка на C над libbase64, що зазвичай працює в 2–5 разів швидше за реалізацію зі stdlib на великих вхідних даних.

Bash
pip install pybase64
Python 3.8+
import pybase64

# Drop-in replacement — identical API to the stdlib base64 module
encoded_image = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQI12NgAAIABQ..."

image_bytes = pybase64.b64decode(encoded_image, validate=False)
print(f"Decoded {len(image_bytes):,} bytes")

# URL-safe variant — same as base64.urlsafe_b64decode()
token_bytes = pybase64.urlsafe_b64decode("eyJpZCI6IDQ3MX0=")
print(token_bytes)  # b'{"id": 471}'

# Benchmark note: on strings under ~10 KB the function-call overhead dominates
# and the speedup is negligible. Profile before switching.

API навмисно ідентичний base64 — замініть імпорт, і більше нічого змінювати не потрібно. Використовуйте його лише тоді, коли профілювання підтверджує, що Base64 справді є вузьким місцем, що рідко трапляється поза високонавантаженими конвеєрами обробки даних.

Поширені помилки

Я бачив ці чотири помилки на код-рев'ю знову і знову — вони особливо часті у розробників, що прийшли з мов на кшталт JavaScript або PHP, де декодування Base64 повертає рядок безпосередньо, або з туторіалів, що повністю пропускають обробку помилок.

Помилка 1: забути викликати .decode() на результаті

Before · Python
After · Python
# ❌ b64decode() returns bytes — this crashes downstream
import base64

raw = base64.b64decode("eyJ1c2VyX2lkIjogNDcxLCAicm9sZSI6ICJhZG1pbiJ9")

# TypeError: byte indices must be integers or slices, not str
user_id = raw["user_id"]
# ✅ decode bytes → str, then parse
import base64, json

raw = base64.b64decode("eyJ1c2VyX2lkIjogNDcxLCAicm9sZSI6ICJhZG1pbiJ9")
payload = json.loads(raw.decode("utf-8"))
print(payload["user_id"])  # 471
print(payload["role"])     # admin

Помилка 2: використання b64decode() для URL-безпечного Base64

Before · Python
After · Python
# ❌ JWT and OAuth tokens use '-' and '_' — not in standard alphabet
import base64

jwt_segment = "eyJ1c2VyX2lkIjogMjg5M30"
# binascii.Error or silently wrong bytes — unpredictable behaviour
base64.b64decode(jwt_segment)
# ✅ use urlsafe_b64decode() for any token with '-' or '_'
import base64, json

jwt_segment = "eyJ1c2VyX2lkIjogMjg5M30"
padded = jwt_segment + "=" * (-len(jwt_segment) % 4)
data = base64.urlsafe_b64decode(padded)
print(json.loads(data.decode("utf-8")))
# {'user_id': 2893}

Помилка 3: не відновлювати педдінг у усічених токенів

Before · Python
After · Python
# ❌ JWTs and most URL-transmitted tokens strip '=' — this crashes
import base64

# Valid JWT payload segment — no padding, as per spec
segment = "eyJ0eXBlIjogImFjY2VzcyIsICJqdGkiOiAiMzgxIn0"
base64.urlsafe_b64decode(segment)
# binascii.Error: Incorrect padding
# ✅ add padding before every urlsafe_b64decode() call
import base64, json

segment = "eyJ0eXBlIjogImFjY2VzcyIsICJqdGkiOiAiMzgxIn0"
padded = segment + "=" * (-len(segment) % 4)
result = json.loads(base64.urlsafe_b64decode(padded).decode("utf-8"))
print(result["type"])  # access
print(result["jti"])   # 381

Помилка 4: виклик .decode("utf-8") на бінарних даних

Before · Python
After · Python
# ❌ Binary files (PDF, PNG, ZIP) are not UTF-8 text — this crashes
import base64

# Base64-encoded PDF starts with JVBERi... (%PDF-)
pdf_b64 = "JVBERi0xLjQKJeLjz9MKNyAwIG9iago8PC9U..."
pdf_text = base64.b64decode(pdf_b64).decode("utf-8")
# UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe2
# ✅ write binary directly to a file — no .decode() needed
import base64
from pathlib import Path

pdf_b64 = "JVBERi0xLjQKJeLjz9MKNyAwIG9iago8PC9U..."
pdf_bytes = base64.b64decode(pdf_b64)
Path("report_q1_2026.pdf").write_bytes(pdf_bytes)
print(f"Saved {len(pdf_bytes):,} bytes")

Декодування великих файлів Base64 у Python

Завантаження 200 МБ файлу Base64 через Path.read_text() та декодування його за один виклик одночасно виділить пам'ять для закодованого рядка, декодованих байт та проміжних представлень — що легко вичерпає пам'ять на обмежених серверах або в Lambda-функціях. Для файлів розміром більше ~50–100 МБ використовуйте натомість потоковий підхід.

Потокове декодування на диск (без завантаження всього файлу в RAM)

Python 3.8+
import base64

def decode_large_b64_file(input_path: str, output_path: str, chunk_size: int = 65536) -> None:
    """
    Decode a large Base64 file in chunks to avoid loading the entire encoded
    string into memory. chunk_size must be a multiple of 4 to keep Base64
    block boundaries aligned across reads.
    """
    assert chunk_size % 4 == 0, "chunk_size must be a multiple of 4"

    bytes_written = 0
    with open(input_path, "rb") as src, open(output_path, "wb") as dst:
        while True:
            chunk = src.read(chunk_size)
            if not chunk:
                break
            # Strip whitespace that may appear in wrapped/multiline Base64
            chunk = chunk.strip()
            if chunk:
                dst.write(base64.b64decode(chunk))
                bytes_written += len(chunk)

    print(f"Decoded {bytes_written:,} Base64 bytes → {output_path}")

# Example: decode a 300 MB database snapshot stored as Base64
decode_large_b64_file("snapshot_2026_03_13.b64", "snapshot_2026_03_13.sql.gz")

Декодування Base64 за допомогою base64.decodebytes() для PEM / багаторядкових даних

Python 3.8+
import base64

# base64.decodebytes() is designed for MIME / PEM Base64 that wraps at 76 chars.
# It silently ignores whitespace and newlines — perfect for certificate files.

with open("server_cert.pem", "rb") as f:
    pem_data = f.read()

# Strip PEM headers if present, then decode
lines = [
    line for line in pem_data.splitlines()
    if not line.startswith(b"-----")
]
raw_cert = base64.decodebytes(b"
".join(lines))
print(f"Certificate DER payload: {len(raw_cert):,} bytes")
Примітка:Використовуйте base64.decodebytes() для PEM-сертифікатів, MIME-вкладень і будь-якого Base64, що переносить на фіксованій ширині рядка. Використовуйте потоковий підхід вище для великих непрозорих блобів (резервні копії, медіафайли). Для компактних однорядкових токенів (JWT, OAuth) b64decode() або urlsafe_b64decode() завжди є правильним вибором.

Методи декодування Base64 у Python — швидке порівняння

МетодАлфавітПеддінгВивідПотребує встановленняНайкраще для
base64.b64decode()Стандартний (A–Z a–z 0–9 +/)Обов'язковийbytesНі (stdlib)Загального призначення, email, PEM
base64.decodebytes()Стандартний (A–Z a–z 0–9 +/)Ігнорується (прибирає пробіли)bytesНі (stdlib)PEM-сертифікати, MIME-вкладення, багаторядковий Base64
base64.urlsafe_b64decode()URL-безпечний (A–Z a–z 0–9 -_)Обов'язковийbytesНі (stdlib)JWT, OAuth, Google Cloud API
base64.b32decode()32-символьний (A–Z, 2–7)Обов'язковийbytesНі (stdlib)TOTP-секрети, DNS-сумісні ID
base64.b16decode()Шістнадцятковий (0–9, A–F)НемаєbytesНі (stdlib)Hex-закодовані контрольні суми, хеші
pybase64.b64decode()Стандартний (A–Z a–z 0–9 +/)Обов'язковийbytesТак (pip)Високонавантажені конвеєри, великі навантаження
CLI: base64 --decodeСтандартнийАвтоstdoutНі (системний)Швидка перевірка в терміналі

Використовуйте b64decode() за замовчуванням. Перемикайтеся на urlsafe_b64decode()щойно побачите - або _ у вхідних даних — ці символи є безпомилковою ознакою URL-безпечного Base64. Звертайтеся до pybase64 лише після того, як профілювання підтвердить вузьке місце. Для разових перевірок під час розробки Base64 Decoder від ToolDeck обробляє обидва алфавіти та автоматично виправляє педдінг — Python-оточення не потрібно.

Часті запитання

Як декодувати рядок Base64 у звичайний рядок у Python?

Викличте base64.b64decode(encoded), щоб отримати bytes, потім викличте .decode("utf-8")на результаті, щоб отримати Python str. Ці два кроки завжди окремі, тому що b64decode() лише обертає алфавіт Base64 — він не знає, чи було вихідне вмістиме UTF-8, Latin-1 або бінарним. Якщо дані використовують кодування, відмінне від UTF-8, передайте правильну назву кодека в .decode(), наприклад .decode("latin-1").

Чому при декодуванні Base64 у Python з'являється помилка “Incorrect padding”?

Рядки Base64 повинні мати довжину, кратну 4 символам. JWT, токени OAuth та дані, що передаються в URL, часто видаляють завершальний символ педдінгу =. Виправте це, додавши "=" * (-len(s) % 4) перед декодуванням. Ця формула додає рівно 0, 1 або 2 символи за потреби і є безпечною холостою операцією, коли рядок вже правильно доповнений.

У чому різниця між b64decode() і urlsafe_b64decode() у Python?

Обидва декодують один і той самий алгоритм Base64, але з різними алфавітами для 62-го і 63-го символів.b64decode() використовує + і /; urlsafe_b64decode() використовує - і _. URL-безпечний варіант визначений у RFC 4648 §5 і використовується скрізь, де Base64 повинен виживати в URL, HTTP-заголовках або значеннях cookie без відсоткового кодування. Плутанина між ними призводить або до binascii.Error, або до непомітно пошкодженого виводу.

Як декодувати зображення, закодоване в Base64, у Python?

Декодуйте в bytes за допомогою base64.b64decode(encoded), потім запишіть ці bytes безпосередньо у файл — не викликайте .decode("utf-8") на даних зображення. Якщо вхідні дані — це data URL (наприклад, data:image/png;base64,iVBORw0KGgo…), спочатку видаліть префікс:

Python 3.8+
import base64
from pathlib import Path

# Data URL from an <img src="..."> or an API response
data_url = (
    "data:image/png;base64,"
    "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQI12NgAAIABQ=="
)

# Split off the "data:image/png;base64," prefix
_, encoded = data_url.split(",", 1)
image_bytes = base64.b64decode(encoded)
Path("avatar_jsmith.png").write_bytes(image_bytes)
print(f"Saved {len(image_bytes)} bytes")

Чи можна декодувати Base64 у Python без імпорту модулів?

Технічно так, але немає жодних причин це робити. Модуль base64 входить до стандартної бібліотеки Python, завжди доступний, завжди встановлений — він не має залежностей, а його функції реалізовані на C. Переписувати Base64 з нуля було б повільніше, більш схильним до помилок і складнішим у обслуговуванні. Завжди використовуйте import base64.

Як декодувати Base64 у Python, коли вхідні дані — bytes, а не рядок?

base64.b64decode() приймає str, bytes і bytearray взаємозамінно — перетворення не потрібне. Якщо ви отримуєте b"SGVsbG8=" із сокета або при читанні файлу, передайте це напряму. Відновлення педдінгу працює так само з bytes: data + b"=" * (-len(data) % 4) при роботі в режимі bytes.

Пов'язані інструменти

  • Base64 Encode — миттєво кодуйте текст або бінарні файли в Base64; зручно для створення тестових даних для вашого Python-коду декодування без запуску скриптів.
  • JWT Decoder — переглядайте заголовок і корисне навантаження JWT без написання коду; навантаження декодується за допомогою URL-безпечного Base64 під капотом, точно як показано у прикладах вище.
  • URL Decode — відсоткове декодування рядків запиту та сегментів шляху; часто потрібне разом із декодуванням Base64 при розборі URL зворотних викликів OAuth або навантажень вебхуків.
  • URL Encode — відсоткове кодування спеціальних символів; зручно, коли потрібно безпечно вбудувати значення, закодоване в Base64, всередину параметра URL-запиту.
Також доступно на:JavaScriptGoJavaC#
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.

DV
Dmitri VolkovТехнічний рецензент

Dmitri is a DevOps engineer who relies on Python as his primary scripting and automation language. He builds internal tooling, CI/CD pipelines, and infrastructure automation scripts that run in production across distributed teams. He writes about the Python standard library, subprocess management, file processing, encoding utilities, and the practical shell-adjacent Python that DevOps engineers use every day.