Como decodificar Base64 para um arquivo
- Cole a string em Base64 ou data URI. Base64 padrão e URL-safe são aceitos, com ou sem preenchimento, quebras de linha ou aspas. Um data URI inteiro funciona, assim como um texto que contenha um: um
url("data:…")de CSS, umsrc="data:…"de HTML ou uma imagem em Markdown. Para uma string longa guardada em arquivo, use Abrir arquivo .txt ou arraste o arquivo para a caixa. - Leia a linha de status abaixo da entrada: se a entrada é válida, qual variante ela é (Standard ou Base64URL), o tamanho decodificado e o tipo Detectado. Um data URI também mostra o tipo Declarado.
- Olhe a prévia e os três campos abaixo dela. Nome do arquivo, Extensão e Tipo MIME são preenchidos a partir da detecção. O que você digitar ali permanece até você clicar em Limpar.
- Clique em Baixar arquivo, ou em Copiar como data URI para ter os bytes de volta como
data:<MIME type>;base64,….
Exemplo carrega um arquivo de teste diferente a cada clique: PNG, PDF, ZIP, WAV, DOCX, JSON, gzip e SVG. Se você arrastar um arquivo que já é binário, por exemplo um PDF em vez de um arquivo de texto com o Base64 dele, a ferramenta avisa e indica Arquivo para Base64, que faz o caminho inverso.
Por que o arquivo aparece como application/octet-stream
application/octet-stream significa “alguns bytes, tipo desconhecido”. Esse rótulo vai parar na frente do Base64 por motivos banais. O FileReader.readAsDataURL() do Chrome gera data:application/octet-stream;base64, para qualquer arquivo cujo tipo o navegador não conhece. Sistemas de armazenamento e exportação que guardam os bytes, mas não o tipo, rotulam tudo desse jeito. Algumas APIs declaram todo anexo como octet-stream. Um visualizador que depende do rótulo então se recusa a mostrar o arquivo, e o download fica sem uma extensão útil.
Normalmente os próprios bytes identificam o formato: a maioria dos formatos começa com uma assinatura fixa, e a ferramenta verifica mais de 60 delas. Algumas assinaturas são compartilhadas, então a ferramenta olha mais adiante no arquivo:
| Primeiros bytes | O Base64 começa com | Pode ser | Como a ferramenta diferencia |
|---|---|---|---|
PK 03 04 | UEsDB | ZIP, DOCX, XLSX, PPTX, EPUB, ODT, ODS, JAR, APK | Nomes das entradas: word/, xl/, ppt/, a entrada mimetype, AndroidManifest.xml, META-INF/MANIFEST.MF |
RIFF | UklGR | WebP, WAV, AVI | As quatro letras no byte 8 |
ftyp no byte 4 | AAAA, por exemplo AAAAIGZ0eXB | MP4, M4A, MOV, 3GP, HEIC, AVIF | A marca nos bytes 8 a 11 |
OggS | T2dnUw | Ogg Vorbis, Opus, vídeo Theora | O cabeçalho do codec na primeira página |
1A 45 DF A3 | GkXfo | WebM, MKV | O tipo de documento webm |
D0 CF 11 E0 | 0M8R4KGxGuE | DOC, XLS, PPT, MSG do Outlook, arquivos do Office protegidos por senha | Não consegue; informa “DOC/XLS/MSG (OLE)” |
A lista completa de assinaturas está em prefixos comuns de Base64.
Quando um data URI declara um tipo e o conteúdo discorda, um aviso indica isso, por exemplo “O data URI diz application/octet-stream, mas o conteúdo parece ser PDF.”, e o tipo detectado é usado. O tipo declarado só prevalece quando a detecção é fraca: quando os bytes parecem texto simples ou binário desconhecido.
Base64 dentro de Base64, codificação de URL e gzip
Dados que passaram por vários sistemas muitas vezes estão embrulhados mais de uma vez. Depois de decodificar, a ferramenta verifica se o resultado é outra camada e oferece Decodificar de novo:
| Aviso | O que aconteceu |
|---|---|
| “Os dados decodificados são, eles mesmos, texto Base64 (dentro: PDF).” | Codificado duas vezes, normalmente por duas camadas de código que codificaram “por garantia” |
| “Os dados decodificados são Base64 com codificação de URL” | O Base64 recebeu codificação percentual para uma URL (%2B, %2F, %3D) antes de ser codificado de novo |
| “Os dados decodificados são um data: URI.” | Alguém codificou a string data:… inteira em vez só do conteúdo |
| “Os dados estão compactados com gzip: 817 B descompactados (PDF).” | Compactado antes da codificação para economizar espaço, comum em logs e filas de mensagens; zlib também é reconhecido |
Decodificar de novo coloca a camada interna na entrada e a decodifica; Voltar retorna um passo e lembra até 20 passos. Os avisos de gzip e zlib só aparecem depois que a ferramenta realmente descompactou os dados, para resultados de até 16 MB. A prévia de gzip também mostra o nome original do arquivo e a data de modificação gravados no cabeçalho, com Salvar descompactado para o conteúdo. Para payloads de texto, o decodificador de Base64 gzip é a ferramenta mais direta.
Salvando com a extensão certa
Windows e macOS escolhem o programa pela extensão, então um PDF salvo como decoded.bin parece quebrado, mesmo com todos os bytes corretos. Os campos Extensão e Tipo MIME acompanham a detecção até você digitar neles:
- O nome do arquivo vem de um parâmetro
name=oufilename=no data URI, ou do nome do arquivo de texto que você abriu, sem a terminação.txtou.b64:report.pdf.b64.txté salvo comoreport.pdf. - Para um arquivo OLE que você sabe que é uma planilha, digite
xlsem Extensão; a ferramenta não consegue distinguir DOC, XLS e MSG. - Um Tipo MIME digitado também renderiza a prévia de novo como esse tipo. Se a ferramenta disser Binary, mas você espera áudio, digitar
audio/oggfaz com que ela tente o player de áudio. - O tipo MIME afeta só o download e o Copiar como data URI; um arquivo no disco não tem tipo MIME, só os seus bytes e o seu nome.
O que a prévia mostra
Todo resultado lista tipo, tipo MIME, extensão, tamanho e um hash SHA-256, com Mostrar dump hex para os primeiros 512 bytes. Para dados binários desconhecidos, o dump hex já vem aberto. Conforme o tipo:
| Tipo | Prévia |
|---|---|
| Imagens | A imagem e o tamanho em pixels; HEIC, TIFF e JPEG XL normalmente recebem um aviso de que não é possível exibir, porque a maioria dos navegadores não tem decodificador para eles. Veja Base64 para imagem. |
| O visualizador de PDF do seu navegador, versão, quantidade de páginas, título. Veja Base64 para PDF. | |
| Áudio e vídeo | Um player com duração e dimensões do vídeo |
| Fontes | Texto de exemplo editável na fonte decodificada, com família, estilo e quantidade de glifos |
| ZIP, DOCX, XLSX, PPTX, EPUB | A lista de entradas com Ver e Salvar para cada arquivo, mais o texto do documento para arquivos do Office e e-books. Veja Base64 para ZIP. |
| Texto | Charset, linhas, JSON formatado, uma tabela para CSV, o elemento raiz para XML, HTML em sandbox |
| Certificados e chaves | Um link para o decodificador de certificados |
Detectar o tipo MIME de um Base64 no código
Vinte e quatro caracteres de Base64 decodificam para 18 bytes, o suficiente para as assinaturas comuns. Isto funciona em navegadores e no Node.js 16 ou mais recente:
function sniffMime(b64) {
const head = b64.replace(/^data:[^,]*,/, "").replace(/\s+/g, "").slice(0, 24)
.replace(/-/g, "+").replace(/_/g, "/");
const b = Uint8Array.from(atob(head), (c) => c.charCodeAt(0));
const str = (start, len) => String.fromCharCode(...b.subarray(start, start + len));
if (str(0, 5) === "%PDF-") return "application/pdf";
if (str(0, 8) === "\x89PNG\r\n\x1a\n") return "image/png";
if (b[0] === 0xff && b[1] === 0xd8 && b[2] === 0xff) return "image/jpeg";
if (str(0, 4) === "GIF8") return "image/gif";
if (str(0, 4) === "RIFF" && str(8, 4) === "WEBP") return "image/webp";
if (str(0, 4) === "RIFF" && str(8, 4) === "WAVE") return "audio/wav";
if (str(4, 4) === "ftyp") return "video/mp4"; // also M4A, MOV, HEIC: see bytes 8-11
if (str(0, 4) === "PK\x03\x04") return "application/zip"; // also DOCX, XLSX, PPTX
if (b[0] === 0x1f && b[1] === 0x8b) return "application/gzip";
if (str(0, 3) === "ID3" || (b[0] === 0xff && (b[1] & 0xe6) === 0xe2)) return "audio/mpeg";
return "application/octet-stream";
}
sniffMime("data:application/octet-stream;base64,JVBERi0xLjcKJeLjz9MK"); // "application/pdf"
Na linha de comando, o file lê os bytes decodificados da entrada padrão:
base64 -d payload.b64 | file -b --mime-type -
Isso imprime application/pdf para um PDF. Se você decodificar com o OpenSSL, acrescente -A para uma string em uma única linha. Sem ele, o openssl base64 -d não grava nada, em silêncio, quando a linha não tem quebra no final ou é longa demais (1.024 caracteres ou mais no OpenSSL 3.5). Mais em Base64 em JavaScript e Base64 em Bash.
Perguntas frequentes
Como descobrir o tipo MIME de uma string Base64?
Decodifique os primeiros bytes e compare com as assinaturas de arquivo conhecidas: JVBERi0 decodifica para %PDF-, iVBORw0KGgo para a assinatura do PNG. Esta página faz isso para mais de 60 formatos, e a função JavaScript desta página cobre os mais comuns no seu próprio código.
O que significa "não é possível exibir o arquivo como application/octet-stream"?
application/octet-stream é o rótulo genérico para bytes de tipo desconhecido, então um visualizador que confia no rótulo não tem por onde começar. Cole a mesma string aqui: o conteúdo é examinado no lugar do rótulo, e a extensão e o tipo MIME são preenchidos para você.
O que fazer quando o tipo não é detectado?
A prévia mostra então Binary, com um dump hex dos primeiros 512 bytes. Se você souber o formato, digite a extensão e o tipo MIME antes de baixar; o tipo MIME também troca a prévia, então audio/ogg faz a ferramenta tentar tocar os bytes.
Qual o tamanho máximo de arquivo que dá para decodificar?
Não há limite fixo; o limite é a memória do seu dispositivo. Acima de uns 50 MB de Base64, a página dá uma pausa curta enquanto decodifica, e Copiar como data URI fica desativado para arquivos com mais de 32 MB.
O arquivo é enviado para algum lugar?
Não. A decodificação, a detecção do tipo e a prévia rodam no seu navegador, e a Content Security Policy da página a impede de fazer requisições de rede, exceto as do contador de visitas da Cloudflare.