Cómo decodificar Base64 a un archivo
- Pega la cadena en Base64 o data URI. Se admiten Base64 estándar y URL-safe, con o sin relleno, saltos de línea o comillas. Funciona una data URI completa y también un texto que la contenga: un
url("data:…")de CSS, unsrc="data:…"de HTML o una imagen de Markdown. Para una cadena larga guardada en un archivo, usa Abrir archivo .txt o suéltalo en el cuadro. - Lee la línea de estado bajo la entrada: si la entrada es válida, qué variante es (Standard o Base64URL), el tamaño decodificado y el tipo Detectado. Una data URI muestra además su tipo Declarado.
- Mira la vista previa y los tres campos que hay debajo. Nombre de archivo, Extensión y Tipo MIME se rellenan según la detección. Lo que escribas ahí se mantiene hasta que pulses Borrar.
- Pulsa Descargar archivo, o Copiar como data URI para recuperar los bytes como
data:<MIME type>;base64,….
Ejemplo carga un archivo de prueba distinto en cada clic: PNG, PDF, ZIP, WAV, DOCX, JSON, gzip y SVG. Si sueltas un archivo que ya es binario, por ejemplo un PDF en lugar de un archivo de texto con su Base64, la herramienta te lo dice y enlaza con Archivo a Base64, que hace el camino inverso.
Por qué el archivo aparece como application/octet-stream
application/octet-stream significa «unos bytes, tipo desconocido». Acaba delante del Base64 por motivos corrientes. FileReader.readAsDataURL() de Chrome produce data:application/octet-stream;base64, para cualquier archivo cuyo tipo no conoce el navegador. Los sistemas de almacenamiento y exportación que guardan los bytes pero no el tipo etiquetan así todo. Algunas API declaran todos los adjuntos como octet-stream. Un visor que depende de la etiqueta se niega entonces a mostrar el archivo, y una descarga no recibe ninguna extensión útil.
Los propios bytes suelen identificar el formato: la mayoría de los formatos empiezan con una firma fija, y la herramienta comprueba más de 60. Algunas firmas son compartidas, así que la herramienta mira más adentro del archivo:
| Primeros bytes | El Base64 empieza por | Puede ser | Cómo los distingue la herramienta |
|---|---|---|---|
PK 03 04 | UEsDB | ZIP, DOCX, XLSX, PPTX, EPUB, ODT, ODS, JAR, APK | Nombres de entrada: word/, xl/, ppt/, la entrada mimetype, AndroidManifest.xml, META-INF/MANIFEST.MF |
RIFF | UklGR | WebP, WAV, AVI | Las cuatro letras del byte 8 |
ftyp en el byte 4 | AAAA, por ejemplo AAAAIGZ0eXB | MP4, M4A, MOV, 3GP, HEIC, AVIF | La marca de los bytes 8 a 11 |
OggS | T2dnUw | Ogg Vorbis, Opus, vídeo Theora | El encabezado del códec en la primera página |
1A 45 DF A3 | GkXfo | WebM, MKV | El tipo de documento webm |
D0 CF 11 E0 | 0M8R4KGxGuE | DOC, XLS, PPT, MSG de Outlook, archivos de Office protegidos con contraseña | No puede; indica «DOC/XLS/MSG (OLE)» |
La lista completa de firmas está en prefijos Base64 habituales.
Cuando una data URI declara un tipo y el contenido no coincide, una nota lo indica, por ejemplo «La data URI indica application/octet-stream, pero el contenido parece PDF.», y se usa el tipo detectado. El tipo declarado solo se impone cuando la detección es débil: cuando los bytes parecen texto plano o binario desconocido.
Base64 dentro de Base64, codificación URL y gzip
Los datos que han pasado por varios sistemas suelen venir envueltos más de una vez. Tras decodificar, la herramienta comprueba si el resultado es otra capa y ofrece Decodificar de nuevo:
| Nota | Qué ha pasado |
|---|---|
| «Los datos decodificados son a su vez texto Base64 (contenido: PDF).» | Codificado dos veces, normalmente por dos capas de código que codificaron cada una «por si acaso» |
| «Los datos decodificados son Base64 codificado para URL» | El Base64 se codificó con porcentajes para una URL (%2B, %2F, %3D) antes de volver a codificarse |
| «Los datos decodificados son una data: URI.» | Alguien codificó la cadena data:… entera en lugar de su contenido |
| «Los datos están comprimidos con gzip: 817 B descomprimidos (PDF).» | Comprimido antes de codificar para ahorrar espacio, algo habitual en logs y colas de mensajes; también se reconoce zlib |
Decodificar de nuevo pone la capa interior en la entrada y la decodifica; Atrás vuelve a salir y recuerda hasta 20 pasos. Las notas de gzip y zlib solo aparecen después de que la herramienta haya descomprimido de verdad los datos, con resultados de hasta 16 MB. La vista previa de gzip muestra además el nombre original del archivo y la fecha de modificación guardados en el encabezado, con Guardar descomprimido para el contenido. Para contenido de texto, el decodificador Base64 gzip es la herramienta más directa.
Guardar con la extensión correcta
Windows y macOS eligen el programa según la extensión, así que un PDF guardado como decoded.bin parece roto aunque todos los bytes sean correctos. Los campos Extensión y Tipo MIME siguen a la detección hasta que escribes en ellos:
- El nombre de archivo sale de un parámetro
name=ofilename=de una data URI, o del nombre del archivo de texto que abriste, sin su terminación.txto.b64:report.pdf.b64.txtse guarda comoreport.pdf. - Si sabes que un archivo OLE es una hoja de cálculo, escribe
xlsen Extensión; la herramienta no distingue DOC, XLS y MSG. - Un Tipo MIME que introduzcas también vuelve a generar la vista previa de ese tipo. Si la herramienta dice Binary pero esperas audio, escribir
audio/ogghace que pruebe el reproductor de audio. - El tipo MIME solo afecta a la descarga y a Copiar como data URI; un archivo en el disco no tiene tipo MIME, solo sus bytes y su nombre.
Qué muestra la vista previa
Cada resultado indica el tipo, el tipo MIME, la extensión, el tamaño y un hash SHA-256, con Mostrar volcado hex para los primeros 512 bytes. Con datos binarios desconocidos, el volcado hex aparece abierto desde el principio. Según el tipo:
| Tipo | Vista previa |
|---|---|
| Imágenes | La imagen y su tamaño en píxeles; HEIC, TIFF y JPEG XL suelen recibir una nota de «no puede mostrar» porque la mayoría de navegadores no tienen decodificador. Consulta Base64 a imagen. |
| El visor de PDF de tu navegador, la versión, el número de páginas y el título. Consulta Base64 a PDF. | |
| Audio y vídeo | Un reproductor con la duración y el tamaño del vídeo |
| Fuentes | Texto de ejemplo editable con la fuente decodificada, con familia, estilo y número de glifos |
| ZIP, DOCX, XLSX, PPTX, EPUB | La lista de entradas con Ver y Guardar para cada archivo, más el texto del documento en archivos de Office y libros electrónicos. Consulta Base64 a ZIP. |
| Texto | Juego de caracteres, líneas, JSON formateado, una tabla para CSV, el elemento raíz en XML, HTML en sandbox |
| Certificados y claves | Un enlace al decodificador de certificados |
Detectar el tipo MIME de un Base64 en código
Veinticuatro caracteres de Base64 se decodifican en 18 bytes, suficientes para las firmas más comunes. Esto funciona en navegadores y en Node.js 16 o posterior:
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"
En la línea de comandos, file lee los bytes decodificados desde la entrada estándar:
base64 -d payload.b64 | file -b --mime-type -
Con un PDF imprime application/pdf. Si decodificas con OpenSSL, añade -A para una cadena en una sola línea. Sin esa opción, openssl base64 -d no escribe nada y no avisa cuando la línea no tiene salto de línea final o es demasiado larga (1.024 caracteres o más en OpenSSL 3.5). Más en Base64 en JavaScript y Base64 en Bash.
Preguntas frecuentes
¿Cómo sé el tipo MIME de una cadena Base64?
Decodifica los primeros bytes y compáralos con firmas de archivo conocidas: JVBERi0 se decodifica en %PDF- e iVBORw0KGgo en la firma de PNG. Esta página lo hace con más de 60 formatos, y la función de JavaScript de esta página cubre los más comunes en tu propio código.
¿Qué significa «cannot display the file as application/octet-stream»?
application/octet-stream es la etiqueta genérica para bytes de tipo desconocido, así que un visor que se fía de la etiqueta no tiene nada en qué basarse. Pega aquí la misma cadena: se examina el contenido en lugar de la etiqueta, y la extensión y el tipo MIME se rellenan solos.
¿Qué puedo hacer si no se detecta el tipo?
En ese caso la vista previa muestra Binary con un volcado hex de los primeros 512 bytes. Si conoces el formato, escribe la extensión y el tipo MIME antes de descargar; el tipo MIME también cambia la vista previa, así que con audio/ogg la herramienta intenta reproducir los bytes.
¿Qué tamaño de archivo puedo decodificar?
No hay un límite fijo; el límite es la memoria de tu dispositivo. Por encima de unos 50 MB de Base64 la página se detiene un momento mientras decodifica, y Copiar como data URI se desactiva con archivos de más de 32 MB.
¿Se sube el archivo a algún sitio?
No. La decodificación, la detección del tipo y la vista previa se ejecutan en tu navegador, y la Content Security Policy de la página le impide hacer peticiones de red, salvo las del contador de visitas de Cloudflare.