Cómo decodificar Base64 a XML
- Pega el Base64 en Entrada · Base64. La página se abre con un pequeño ejemplo.
- El XML aparece en Salida · texto. Parece XML en la línea de estado confirma que el contenido empieza como un documento XML.
- Si la salida muestra huecos entre las letras o un aviso de datos binarios, el XML está en UTF-16: pon Juego de caracteres en UTF-16LE, o en Detección automática si empieza con una marca de orden de bytes.
- Copiar salida copia el texto. Descargar guarda los bytes originales como
decoded.xml.
El ejemplo PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxub3RlPjx0bz55b3U8L3RvPjxib2R5PkhlbGxvPC9ib2R5Pjwvbm90ZT4= se decodifica así:
<?xml version="1.0"?>
<note><to>you</to><body>Hello</body></note>
La operación inversa es XML a Base64.
Cómo reconocer XML codificado
Como el XML empieza por <, su Base64 empieza por P, y los caracteres siguientes revelan más:
| El Base64 empieza por | Inicio decodificado | Documento típico |
|---|---|---|
PD94bWwg | <?xml | Cualquier archivo XML con declaración |
PHNhbWxwOlJlc3BvbnNl | <samlp:Response | Respuesta de inicio de sesión SAML (decodificador SAML) |
PHNvYXA6RW52ZWxvcGU | <soap:Envelope | Mensaje SOAP |
PEludm9pY2U | <Invoice | Factura electrónica UBL |
//48AD8AeABtAGwA | BOM + <?xml en UTF-16LE | XML guardado como UTF-16 |
Un valor que debería ser SAML pero no empieza por P suele estar comprimido; más abajo se explica cómo descomprimirlo.
UTF-16 y otras codificaciones
La mayor parte del XML está en UTF-8, que es lo que el decodificador supone. Hay dos casos que necesitan otro Juego de caracteres:
- Los documentos UTF-16, habituales en herramientas de Windows y en .NET, tienen un byte cero junto a cada carácter ASCII. Decodificados como UTF-8 parecen datos binarios, y la herramienta lo indica. Con Detección automática o UTF-16LE aparece el texto completo, que empieza por
<?xml version="1.0" encoding="UTF-16"?>. Descargar conserva los bytes pero llama al archivodecoded.bin, así que cámbiale la extensión a.xml. - Los documentos en Latin-1 o Windows-1252 declaran
encoding="ISO-8859-1"o algo parecido. En modo UTF-8, las letras acentuadas se ven como�; elige el juego de caracteres declarado para leerlas.
La declaración XML de la salida te dice qué juego de caracteres pretendía usar el autor. Un analizador XML que lea el archivo descargado usa esa declaración, así que el archivo está bien aunque la vista en pantalla haya necesitado elegir el juego de caracteres a mano.
De dónde sale el XML en Base64
SAML es la fuente más frecuente: los proveedores de identidad envían el SAMLResponse a tu aplicación como XML codificado en Base64, y copiarlo desde la pestaña de red del navegador es la forma habitual de depurar un inicio de sesión. Los servicios SOAP y las plataformas de facturación electrónica devuelven documentos y adjuntos como campos Base64. El correo electrónico puede llevar adjuntos XML como partes MIME en Base64, que el decodificador de correo extrae.
En los valores SAMLRequest de las URL de redirección, el XML se comprimió con DEFLATE sin procesar antes de codificarlo, así que decodificar el Base64 sin más da datos binarios. El decodificador de Base64 con gzip lo descomprime. Los escapes %2B, %2F y %3D se decodifican automáticamente; para un valor completamente codificado para URL, usa antes el decodificador de URL.
Base64 a XML en código
Pasa los bytes decodificados al analizador XML sin convertirlos antes en una cadena, para que lea la codificación de la propia declaración:
import base64
import xml.etree.ElementTree as ET
s = "PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxub3RlPjx0bz55b3U8L3RvPjxib2R5PkhlbGxvPC9ib2R5Pjwvbm90ZT4="
root = ET.fromstring(base64.b64decode(s))
root.find("body").text # 'Hello'
// Browser
const s = "PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxub3RlPjx0bz55b3U8L3RvPjxib2R5PkhlbGxvPC9ib2R5Pjwvbm90ZT4=";
const bytes = Uint8Array.from(atob(s), c => c.charCodeAt(0));
const doc = new DOMParser().parseFromString(new TextDecoder().decode(bytes), "application/xml");
Para XML en UTF-16 o Latin-1 en el navegador, pasa la etiqueta correcta a TextDecoder. Más en Base64 en Python y Base64 en JavaScript.
Preguntas frecuentes
¿Cómo decodifico Base64 a un archivo XML?
Pega el Base64 arriba. Cuando la línea de estado diga XML, Descargar guarda los bytes decodificados como decoded.xml, byte a byte, con la codificación original y cualquier firma intacta.
¿Cómo sé si un Base64 contiene XML?
Los documentos con declaración XML empiezan por PD94bWwg (<?xml ). Sin declaración, la cadena sigue empezando por P, porque todo documento empieza por <; PHNhbWxwOlJlc3BvbnNl es <samlp:Response.
¿Puede la herramienta formatear o indentar el XML?
No. El XML se muestra exactamente como se decodificó; la opción Formatear JSON solo se aplica a JSON. Mostrar los bytes originales es importante en el XML firmado, donde cualquier cambio de formato altera el contenido.
¿Por qué mi SAMLRequest decodificado parece bytes aleatorios?
Las peticiones SAML enviadas en una URL de redirección se comprimen con DEFLATE sin procesar antes de codificarlas en Base64. Descomprímelas con el decodificador de Base64 con gzip o ábrelas en el decodificador SAML.