Коли 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.
Мінімальний робочий приклад
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"]) # 5432b64decode() завжди повертає bytes — ніколи рядок. Якщо вихідні дані були текстом, викличте .decode("utf-8"). Якщо це бінарні дані (зображення, PDF, gzip-архів), залиште bytes як є і запишіть їх у файл або передайте безпосередньо до бібліотеки-споживача.Розширений приклад: sort_keys, ensure_ascii та сувора валідація
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() — він автоматично виконує заміну - → + і _ → /.
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().
| Параметр | Тип | За замовчуванням | Опис |
|---|---|---|---|
| s | bytes | str | bytearray | — | Закодований у Base64 вхідний потік для декодування; ASCII str приймається нарівні з байтовими типами. |
| altchars | bytes | None | None | Послідовність із 2 байт, що замінює + і /; дозволяє використовувати нестандартні алфавіти Base64, що виходять за рамки URL-безпечного варіанту. |
| validate | bool | False | При значенні True викликає binascii.Error для будь-якого символу за межами алфавіту Base64; при False байти не з алфавіту (переноси рядків, пробіли) мовчки ігноруються. |
Значення validate=False за замовчуванням навмисно передбачене для PEM-форматованих даних і багаторядкового Base64 (де переноси рядків часті). Для API-навантажень, завантажень користувачів або будь-яких ненадійних вхідних даних передавайте validate=True, щоб зловити пошкоджені або впроваджені дані на ранньому етапі й отримати зрозуміле повідомлення про помилку.
Помилка педдінгу при декодуванні Base64 у Python — як виправити
Найпоширеніша помилка при декодуванні Base64 у Python:
import base64
base64.b64decode("eyJ0eXBlIjogImFjY2VzcyJ9")
# binascii.Error: Incorrect paddingBase64 вимагає, щоб довжина рядка була кратна 4. Коли дані передаються через URL, HTTP-заголовки або JWT-бібліотеки, завершальний символ педдінгу =видаляється для економії байт. Є два надійних способи виправити це.
Варіант 1: відновлення педдінгу інлайн (рекомендується)
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
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
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-відповіді
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!2026requests, замініть urllib.request на resp = requests.get(url, timeout=5, headers=headers) і body = resp.json(). Логіка декодування Base64 залишається ідентичною.Декодування Base64 через командний рядок
Для швидкої перевірки в терміналі — верифікації токена, перегляду закодованого конфігу або передачі API-виводу через декодер — команда base64 доступна в Linux і macOS. Вбудований Python-модуль -m base64 працює кросплатформно, включаючи Windows.
# 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 пропонує два підходи: перехоплення виключень або попередня валідація за допомогою регулярних виразів.
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 на великих вхідних даних.
pip install pybase64
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() на результаті
# ❌ 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
# ❌ 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: не відновлювати педдінг у усічених токенів
# ❌ 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") на бінарних даних
# ❌ 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)
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 / багаторядкових даних
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…), спочатку видаліть префікс:
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-запиту.