Como decodificar Base64 para XML
- Cole o Base64 em Entrada · Base64. A página abre com um pequeno exemplo.
- O XML aparece em Saída · texto. Parece ser XML na linha de status confirma que o conteúdo começa como um documento XML.
- Se a saída mostrar espaços entre as letras ou um aviso de dados binários, o XML está em UTF-16: ajuste o Charset para UTF-16LE, ou para Detectar automaticamente se ele começar com uma marca de ordem de bytes.
- Copiar saída copia o texto. Baixar salva os bytes originais como
decoded.xml.
O exemplo PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxub3RlPjx0bz55b3U8L3RvPjxib2R5PkhlbGxvPC9ib2R5Pjwvbm90ZT4= decodifica para:
<?xml version="1.0"?>
<note><to>you</to><body>Hello</body></note>
O caminho inverso é XML para Base64.
Como reconhecer XML codificado
Como o XML começa com <, o Base64 dele começa com P, e os caracteres seguintes revelam mais:
| O Base64 começa com | Início decodificado | Documento típico |
|---|---|---|
PD94bWwg | <?xml | Qualquer arquivo XML com declaração |
PHNhbWxwOlJlc3BvbnNl | <samlp:Response | Resposta de login SAML (decodificador SAML) |
PHNvYXA6RW52ZWxvcGU | <soap:Envelope | Mensagem SOAP |
PEludm9pY2U | <Invoice | Nota fiscal eletrônica UBL |
//48AD8AeABtAGwA | BOM + <?xml em UTF-16LE | XML salvo como UTF-16 |
Um valor que deveria ser SAML mas não começa com P geralmente é XML compactado; mais abaixo está explicado como descompactá-lo.
UTF-16 e outras codificações
A maior parte do XML é UTF-8, que é o que o decodificador assume. Dois casos pedem outro Charset:
- Documentos UTF-16, comuns em ferramentas do Windows e no .NET, têm um byte zero ao lado de cada caractere ASCII. Decodificados como UTF-8, parecem dados binários, e a ferramenta avisa. Com Detectar automaticamente ou UTF-16LE, o texto completo aparece, começando com
<?xml version="1.0" encoding="UTF-16"?>. Baixar mantém os bytes, mas dá ao arquivo o nomedecoded.bin, então renomeie para.xml. - Documentos Latin-1 ou Windows-1252 declaram
encoding="ISO-8859-1"ou algo parecido. Letras acentuadas aparecem como�no modo UTF-8; escolha o charset declarado para lê-las.
A declaração XML dentro da saída mostra qual charset o autor pretendia usar. Um parser XML que lê o arquivo baixado segue essa declaração, então o arquivo está correto mesmo que a prévia na tela tenha exigido escolher o charset à mão.
De onde vem o XML em Base64
O SAML é a origem mais frequente: provedores de identidade enviam o SAMLResponse para a sua aplicação como XML codificado em Base64, e copiá-lo da aba de rede do navegador é o jeito habitual de depurar um login. Serviços SOAP e plataformas de nota fiscal eletrônica devolvem documentos e anexos como campos Base64. E-mails podem levar anexos XML como partes MIME em Base64, que o decodificador de e-mail extrai.
Nos valores SAMLRequest de URLs de redirecionamento, o XML foi compactado com DEFLATE bruto antes da codificação, então a decodificação Base64 simples gera binário. O decodificador de Base64 gzip o descompacta. Os escapes %2B, %2F e %3D são decodificados automaticamente; para um valor totalmente codificado para URL, use antes o decodificador de URL.
Base64 para XML no código
Passe os bytes decodificados ao parser XML sem convertê-los antes em string, para que ele leia a codificação na própria declaração:
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 em UTF-16 ou Latin-1 no navegador, passe o rótulo certo ao TextDecoder. Mais em Base64 em Python e Base64 em JavaScript.
Perguntas frequentes
Como decodificar Base64 para um arquivo XML?
Cole o Base64 acima. Quando a linha de status indicar XML, Baixar salva os bytes decodificados como decoded.xml, byte por byte, com a codificação original e qualquer assinatura intactas.
Como saber se um Base64 contém XML?
Documentos com declaração XML começam com PD94bWwg (<?xml ). Sem declaração, a string ainda começa com P, porque todo documento começa com <; PHNhbWxwOlJlc3BvbnNl é <samlp:Response.
A ferramenta formata ou indenta o XML?
Não. O XML aparece exatamente como foi decodificado; a opção Formatar JSON vale só para JSON. Mostrar os bytes originais importa no XML assinado, em que qualquer reformatação altera o conteúdo.
Por que minha SAML request decodificada parece bytes aleatórios?
SAML requests enviadas em uma URL de redirecionamento são compactadas com DEFLATE bruto antes da codificação Base64. Descompacte com o decodificador de Base64 gzip ou abra no decodificador SAML.