Quando uma API retorna um campo content que parece eyJob3N0IjogImRiLXByb2Qi…, ou seu gerenciador de segredos entrega uma credencial codificada, ou você precisa extrair um payload JWT — a decodificação Base64 em Python é o seu primeiro recurso. O módulo integrado base64 cuida de tudo, mas os pequenos detalhes sobre bytes vs strings, alfabetos seguros para URLs e o padding ausente pegam quase todos os desenvolvedores pelo menos uma vez — já depurei essa categoria específica de erros em revisões de código mais vezes do que gostaria de admitir. Este guia cobre base64.b64decode(), urlsafe_b64decode(), reparo automático de padding, decodificação de arquivos e respostas HTTP, ferramentas CLI, validação de entrada e quatro erros comuns com correções antes/depois — todos exemplos executáveis em Python 3.8+. Se você só precisa de uma decodificação rápida sem escrever código, o Decodificador Base64 do ToolDeck lida com Base64 padrão e seguro para URLs instantaneamente no seu navegador.
- ✓base64.b64decode(s) faz parte da biblioteca padrão do Python — sem instalação; sempre retorna bytes, nunca str.
- ✓Encadeie .decode("utf-8") após b64decode() para converter bytes em string Python — a função não conhece a codificação de texto original.
- ✓Para Base64 seguro para URLs (usa - e _ em vez de + e /), use base64.urlsafe_b64decode() — padrão em JWTs, tokens OAuth e credenciais da Google API.
- ✓Corrija o erro comum "Incorrect padding" com: padded = s + "=" * (-len(s) % 4) — adiciona 0, 1 ou 2 caracteres conforme necessário.
- ✓Defina validate=True em qualquer entrada de fontes externas para lançar binascii.Error em caracteres não Base64, em vez de ignorá-los silenciosamente.
O que é decodificação Base64?
Base64 é um esquema de codificação que representa dados binários arbitrários como uma string de 64 caracteres ASCII imprimíveis: A–Z, a–z, 0–9, + e /, com = usado como padding. Cada 4 caracteres Base64 codificam exatamente 3 bytes originais, portanto a forma codificada é aproximadamente 33% maior que a fonte. A decodificação inverte o processo — transformando a representação ASCII de volta nos bytes originais.
Base64 não criptografa dados. É puramente uma codificação de binário para texto — a string codificada é completamente legível por qualquer pessoa que a passe por um decodificador:
Antes — codificado em Base64
eyJob3N0IjogImRiLXByb2QubXljb21wYW55LmludGVybmFsIiwgInBvcnQiOiA1NDMyLCAidXNlciI6ICJhcHBfc3ZjIn0=Depois — decodificado
{"host": "db-prod.mycompany.internal", "port": 5432, "user": "app_svc"}base64.b64decode() — Decodificação com a biblioteca padrão
O módulo base64 do Python vem com a biblioteca padrão — sem instalação, sempre disponível. A função principal é base64.b64decode(s, altchars=None, validate=False). Aceita str, bytes ou bytearray, e sempre retorna bytes.
Exemplo mínimo funcional
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() sempre retorna bytes — nunca uma string. Se os dados originais eram texto, encadeie .decode("utf-8"). Se eram binários (uma imagem, um PDF, um arquivo gzip), mantenha os bytes como estão e grave-os em um arquivo ou passe-os diretamente para a biblioteca consumidora.Exemplo estendido: sort_keys, ensure_ascii e validação estrita
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}")Decodificando Base64 seguro para URLs (base64url)
O Base64 padrão usa + e /, que são caracteres reservados em URLs. A variante segura para URLs (RFC 4648 §5, também chamada de “base64url”) os substitui por - e _. Esta é a codificação usada em tokens JWT, desafios PKCE do OAuth 2.0, credenciais do Google Cloud e a maioria dos fluxos de autenticação web modernos.
Passar Base64 seguro para URLs para b64decode() sem ajustar o alfabeto corromperá os dados silenciosamente ou lançará binascii.Error. Use base64.urlsafe_b64decode() em vez disso — ele trata a substituição - → +e _ → / automaticamente.
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) adiciona exatamente 0, 1 ou 2 caracteres de padding conforme necessário e é uma operação nula quando a string já está corretamente preenchida. É a solução idiomática do Python para problemas de padding em JWT e OAuth.Referência de parâmetros de base64.b64decode()
Todos os parâmetros abaixo se aplicam tanto a b64decode() quanto a urlsafe_b64decode(), exceto altchars, que só está disponível em b64decode().
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
| s | bytes | str | bytearray | — | A entrada codificada em Base64 a decodificar; str ASCII é aceito junto com tipos bytes. |
| altchars | bytes | None | None | Uma sequência de 2 bytes substituindo + e /; permite alfabetos Base64 personalizados além da variante segura para URLs padrão. |
| validate | bool | False | Quando True, lança binascii.Error em qualquer caractere fora do alfabeto Base64; quando False, bytes fora do alfabeto (newlines, espaços) são ignorados silenciosamente. |
O padrão validate=False é intencional para dados no formato PEM e Base64 multilinha (onde newlines são comuns). Para payloads de API, uploads de usuários ou qualquer entrada não confiável, passe validate=True para detectar dados corrompidos ou injetados cedo e exibir um erro claro.
Erro de padding ao decodificar Base64 em Python — Como corrigir
O erro mais frequente ao decodificar Base64 em Python é:
import base64
base64.b64decode("eyJ0eXBlIjogImFjY2VzcyJ9")
# binascii.Error: Incorrect paddingBase64 requer comprimentos de string que sejam múltiplos de 4. Quando os dados passam por URLs, cabeçalhos HTTP ou bibliotecas JWT, o padding =final é removido para economizar bytes. Há duas maneiras confiáveis de corrigir isso.
Opção 1: Restaurar o padding inline (recomendado)
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_keyOpção 2: Decodificação segura para URLs com padding para 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.comDecodificar Base64 de um arquivo e resposta de API
Ler Base64 do disco e decodificar payloads de APIs são os dois cenários de produção mais comuns. Ambos merecem tratamento adequado de erros — padding corrompido e tipos binários inesperados são ocorrências reais, não casos extremos teóricos.
Lendo e decodificando um arquivo 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")Decodificando Base64 de uma resposta HTTP de 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, substitua urllib.request por resp = requests.get(url, timeout=5, headers=headers) e body = resp.json(). A lógica de decodificação Base64 é idêntica.Decodificação Base64 pela linha de comando
Para inspeção rápida no terminal — verificar um token, examinar um blob de configuração codificado, ou canalizar a saída de uma API por um decodificador — o comando base64 está disponível no Linux e macOS. O módulo integrado -m base64 do Python funciona em todas as plataformas, incluindo 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))
"Para trabalho exploratório onde escrever um pipeline de shell parece excessivo, cole a string no Decodificador Base64 online — ele detecta automaticamente a entrada segura para URLs e corrige o padding na hora.
Validando a entrada Base64 antes de decodificar
Quando dados Base64 chegam de entrada do usuário, um webhook ou uma API de terceiros não confiável, valide-os antes de decodificar para obter erros claros e acionáveis em vez de confusos rastreamentos de binascii.Error na profundeza da lógica de negócio. O Python oferece duas abordagens: capturar exceções ou pré-validar com uma expressão regular.
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)Alternativa de alto desempenho: pybase64
Para a grande maioria dos casos de uso, o módulo base64 da biblioteca padrão do Python é completamente adequado. Se você está processando milhares de payloads de API por segundo, decodificando anexos binários de vários megabytes em um loop apertado, ou seu profiler mostra operações Base64 como um gargalo — considere pybase64. É um wrapper de extensão em C em torno de libbase64 e é tipicamente 2–5× mais rápido que a implementação da biblioteca padrão em entradas grandes.
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.A API é intencionalmente idêntica a base64 — troque o import e nada mais muda. Use-a somente quando o profiling confirmar que Base64 é realmente um gargalo, o que é incomum fora de pipelines de dados de alto throughput.
Erros comuns
Já vi esses quatro erros em revisões de código repetidamente — eles são especialmente comuns entre desenvolvedores vindos de linguagens como JavaScript ou PHP onde a decodificação Base64 retorna uma string diretamente, ou de tutoriais que ignoram o tratamento de erros completamente.
Erro 1: Esquecer de chamar .decode() no resultado
# ❌ 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"]) # adminErro 2: Usar b64decode() com entrada Base64 segura para URLs
# ❌ 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}Erro 3: Não corrigir o padding em tokens sem preenchimento
# ❌ 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"]) # 381Erro 4: Chamar .decode("utf-8") em dados binários
# ❌ 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")Decodificando arquivos Base64 grandes em Python
Carregar um arquivo Base64 de 200 MB com Path.read_text() e decodificá-lo em uma única chamada alocará a string codificada, os bytes decodificados e quaisquer representações intermediárias simultaneamente — esgotando facilmente a memória em servidores com restrições ou funções Lambda. Para arquivos maiores que ~50–100 MB, use uma abordagem por chunks.
Decodificação por chunks para disco (sem carregar o arquivo inteiro na 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")Decodificando Base64 com base64.decodebytes() para dados PEM / multilinha
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() para certificados PEM, anexos MIME e qualquer Base64 que quebre em larguras de linha fixas. Use a abordagem por chunks acima para grandes blobs opacos (backups, arquivos de mídia). Para tokens compactos de uma linha (JWT, OAuth), b64decode() ou urlsafe_b64decode() é sempre a escolha certa.Métodos de decodificação Base64 em Python — Comparação rápida
| Método | Alfabeto | Padding | Saída | Requer Instalação | Ideal Para |
|---|---|---|---|---|---|
| base64.b64decode() | Padrão (A–Z a–z 0–9 +/) | Necessário | bytes | Não (stdlib) | Uso geral, e-mail, PEM |
| base64.decodebytes() | Padrão (A–Z a–z 0–9 +/) | Ignorado (remove espaços em branco) | bytes | Não (stdlib) | Certificados PEM, anexos MIME, Base64 multilinha |
| base64.urlsafe_b64decode() | Seguro para URLs (A–Z a–z 0–9 -_) | Necessário | bytes | Não (stdlib) | JWT, OAuth, APIs do Google Cloud |
| base64.b32decode() | 32 caracteres (A–Z, 2–7) | Necessário | bytes | Não (stdlib) | Segredos TOTP, IDs seguros para DNS |
| base64.b16decode() | Hex (0–9, A–F) | Nenhum | bytes | Não (stdlib) | Checksums em hex, hashes |
| pybase64.b64decode() | Padrão (A–Z a–z 0–9 +/) | Necessário | bytes | Sim (pip) | Pipelines de alto throughput, payloads grandes |
| CLI: base64 --decode | Padrão | Auto | stdout | Não (sistema) | Inspeção rápida no terminal |
Use b64decode() como padrão. Mude para urlsafe_b64decode()assim que ver - ou _ na entrada — esses caracteres são o sinal inequívoco de Base64 seguro para URLs. Recorra a pybase64 somente após o profiling confirmar um gargalo. Para verificações rápidas durante o desenvolvimento, o Decodificador Base64 do ToolDeck lida com ambos os alfabetos e repara o padding automaticamente — sem necessidade de ambiente Python.
Perguntas frequentes
Como decodifico uma string Base64 para uma string normal em Python?
Chame base64.b64decode(encoded) para obter bytes, depois chame .decode("utf-8")no resultado para obter um str Python. Os dois passos são sempre separados porque b64decode() apenas inverte o alfabeto Base64 — ele não sabe se o conteúdo original era UTF-8, Latin-1 ou binário. Se os dados usam uma codificação diferente de UTF-8, passe o nome correto do codec para .decode(), por exemplo .decode("latin-1").
Por que recebo "Incorrect padding" ao decodificar Base64 em Python?
Strings Base64 devem ter comprimento múltiplo de 4 caracteres. JWTs, tokens OAuth e dados transmitidos em URLs frequentemente removem o padding = final. Corrija adicionando "=" * (-len(s) % 4) antes de decodificar. Essa fórmula adiciona exatamente 0, 1 ou 2 caracteres conforme necessário, e é uma operação nula segura quando a string já está corretamente preenchida.
Qual é a diferença entre b64decode() e urlsafe_b64decode() em Python?
Ambas decodificam o mesmo algoritmo Base64, mas com alfabetos diferentes para os caracteres 62 e 63.b64decode() usa + e /; urlsafe_b64decode() usa - e _. A variante segura para URLs é definida no RFC 4648 §5 e é usada onde Base64 deve sobreviver em URLs, cabeçalhos HTTP ou valores de cookies sem codificação de porcentagem. Misturá-las causa um binascii.Error ou saída corrompida silenciosamente.
Como decodifico uma imagem codificada em Base64 em Python?
Decodifique para bytes com base64.b64decode(encoded), depois grave esses bytes diretamente em um arquivo — não chame .decode("utf-8") em dados de imagem. Se a entrada for uma data URL (ex.: data:image/png;base64,iVBORw0KGgo…), remova o prefixo primeiro:
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")Posso decodificar Base64 em Python sem importar nenhum módulo?
Tecnicamente sim, mas não há razão para isso. O módulo base64 é parte da biblioteca padrão do Python, sempre disponível, sempre instalado — não tem dependências e suas funções são implementadas em C. Reimplementar Base64 do zero seria mais lento, mais propenso a erros e mais difícil de manter. Sempre use import base64.
Como decodifico Base64 em Python quando a entrada é bytes, não uma string?
base64.b64decode() aceita str, bytes e bytearray indistintamente — nenhuma conversão necessária. Se você receber b"SGVsbG8=" de um socket ou leitura de arquivo, passe diretamente. O reparo de padding funciona da mesma forma com bytes: data + b"=" * (-len(data) % 4) quando operando no modo bytes.
Ferramentas relacionadas
- Base64 Encode — codifique texto ou arquivos binários para Base64 instantaneamente; útil para gerar fixtures de teste para seu código de decodificação Python sem executar um script.
- JWT Decoder — inspecione o cabeçalho e o payload de um JWT sem escrever código; o payload é decodificado com Base64 seguro para URLs por baixo dos panos, exatamente como mostrado nos exemplos acima.
- URL Decode — decodifique por porcentagem query strings e segmentos de caminho; frequentemente necessário junto com a decodificação Base64 ao analisar URLs de callback OAuth ou payloads de webhooks.
- URL Encode — codifique por porcentagem caracteres especiais; útil quando você precisa incorporar um valor codificado em Base64 com segurança dentro de um parâmetro de query de URL.