Base64 Decode em Python — Guia base64.b64decode()

·Backend Developer·Revisado porDmitri Volkov·Publicado

Use o Decodificador Base64 Online gratuito diretamente no seu navegador — sem instalação.

Experimentar Decodificador Base64 Online online →

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

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
Nota:b64decode() 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

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}")

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.

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
Nota:A expressão "=" * (-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âmetroTipoPadrãoDescrição
sbytes | str | bytearrayA entrada codificada em Base64 a decodificar; str ASCII é aceito junto com tipos bytes.
altcharsbytes | NoneNoneUma sequência de 2 bytes substituindo + e /; permite alfabetos Base64 personalizados além da variante segura para URLs padrão.
validateboolFalseQuando 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 é:

Python 3.8+
import base64

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

Base64 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)

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

Opção 2: Decodificação segura para URLs com padding para 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

Decodificar 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

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")

Decodificando Base64 de uma resposta HTTP de 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
Nota:Se você usa a biblioteca requests, 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.

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))
"

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.

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)

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.

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.

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

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

Erro 2: Usar b64decode() com entrada Base64 segura para URLs

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}

Erro 3: Não corrigir o padding em tokens sem preenchimento

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

Erro 4: Chamar .decode("utf-8") em dados binários

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")

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)

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")

Decodificando Base64 com base64.decodebytes() para dados PEM / multilinha

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")
Nota:Use 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étodoAlfabetoPaddingSaídaRequer InstalaçãoIdeal Para
base64.b64decode()Padrão (A–Z a–z 0–9 +/)NecessáriobytesNão (stdlib)Uso geral, e-mail, PEM
base64.decodebytes()Padrão (A–Z a–z 0–9 +/)Ignorado (remove espaços em branco)bytesNão (stdlib)Certificados PEM, anexos MIME, Base64 multilinha
base64.urlsafe_b64decode()Seguro para URLs (A–Z a–z 0–9 -_)NecessáriobytesNão (stdlib)JWT, OAuth, APIs do Google Cloud
base64.b32decode()32 caracteres (A–Z, 2–7)NecessáriobytesNão (stdlib)Segredos TOTP, IDs seguros para DNS
base64.b16decode()Hex (0–9, A–F)NenhumbytesNão (stdlib)Checksums em hex, hashes
pybase64.b64decode()Padrão (A–Z a–z 0–9 +/)NecessáriobytesSim (pip)Pipelines de alto throughput, payloads grandes
CLI: base64 --decodePadrãoAutostdoutNã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:

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")

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.
Também disponível em: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 VolkovRevisor técnico

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.