Como decodificar Base64 para UTF-16
- Cole o Base64 em Entrada · Base64. O Charset já vem em UTF-16LE.
- Leia o texto em Saída · texto. O campo Parece ser geralmente indica binário, porque o detector trata bytes zero como sinal de dados binários; a saída de texto continua correta.
- Se o resultado for uma fileira de caracteres com cara de CJK, mude o Charset para UTF-16BE.
- Se os dados começarem com uma marca de ordem de bytes, Detectar automaticamente escolhe a ordem certa e descarta a marca.
- Copiar saída copia o texto; Baixar salva os bytes brutos.
Para a direção inversa, veja UTF-16 para Base64.
Como reconhecer UTF-16 em Base64
O Base64 de UTF-16 tem um ritmo visível. Texto ASCII em UTF-16 alterna bytes de letras com bytes zero, e bits zero viram A no alfabeto Base64, então o A aparece a cada poucos caracteres:
| Base64 | Ordem dos bytes | Decodificado |
|---|---|---|
SABlAGwAbABvAA== | LE, sem BOM | Hello |
AEgAZQBsAGwAbw== | BE, sem BOM | Hello |
//5IAGkA | LE com BOM FF FE | Hi |
/v8ASABp | BE com BOM FE FF | Hi |
RwBlAHQALQBEAGEAdABlAA== | LE, sem BOM | Get-Date |
Texto ASCII em big-endian sempre começa com A, porque o primeiro byte é zero. Uma string que começa com //4 ou /v8 traz uma marca de ordem de bytes no início.
Ordem dos bytes, BOM e detecção automática
Lido com a ordem de bytes errada, cada par de bytes fica trocado e um texto em inglês vira ideogramas CJK: AEgAZQBsAGwAbw== decodificado como UTF-16LE dá 䠀攀氀氀漀. Nada se perde; basta trocar o Charset.
Detectar automaticamente lida bem com UTF-16 quando os dados começam com BOM. Sem BOM, texto ASCII simples em UTF-16 também é UTF-8 válido (bytes zero são permitidos ali), então a detecção automática pode confundi-lo com UTF-8 cheio de caracteres invisíveis. Nesta página, mantenha UTF-16LE ou UTF-16BE escolhido à mão, a menos que veja //4 ou /v8 no início.
Um número ímpar de bytes indica que algo está errado. SABpAAA= contém 5 bytes; decodificado como UTF-16LE, dá Hi e um � no final. Ou o valor foi cortado, ou nem é UTF-16.
De onde vem o Base64 em UTF-16
A origem mais comum é o PowerShell. Comandos codificados como powershell -enc SQBFAFgA... aparecem em tarefas agendadas, scripts de instalação e logs de segurança, e o Base64 é sempre UTF-16LE. O decodificador de EncodedCommand do PowerShell extrai o valor de uma linha de comando completa e procura mais Base64 dentro do script.
Outras origens são programas .NET que chamam Convert.ToBase64String(Encoding.Unicode.GetBytes(...)), dados do registro e de eventos do Windows e valores NVARCHAR do SQL Server exportados como binário.
Como decodificar Base64 em UTF-16 no código
import base64
raw = base64.b64decode("SABlAGwAbABvAA==")
raw.decode("utf-16-le") # 'Hello'
base64.b64decode("/v8ASABp").decode("utf-16") # 'Hi', byte order taken from the BOM
O Python lança UnicodeDecodeError: truncated data quando a contagem de bytes é ímpar.
// Node.js: little-endian only
Buffer.from("SABlAGwAbABvAA==", "base64").toString("utf16le"); // "Hello"
// Browsers and Node.js: either order
new TextDecoder("utf-16be").decode(Uint8Array.from(atob("AEgAZQBsAGwAbw=="), c => c.charCodeAt(0))); // "Hello"
Em C#, Encoding.Unicode.GetString(Convert.FromBase64String(s)) lê UTF-16LE, e Encoding.BigEndianUnicode lê big-endian. Veja também Python e Node.js.
Perguntas frequentes
Como saber se um Base64 contém UTF-16?
Procure muitos caracteres A em um padrão regular, como em SABlAGwAbABvAA==: em UTF-16, cada letra ASCII fica ao lado de um byte zero. Um //4 ou /v8 no início é a marca de ordem de bytes (BOM) do UTF-16.
Por que aparecem caracteres chineses depois de decodificar?
A ordem dos bytes está invertida. Hello em big-endian lido como little-endian vira 䠀攀氀氀漀. Alterne o Charset entre UTF-16LE e UTF-16BE.
Por que há um � no fim do texto?
O UTF-16 precisa de um número par de bytes. Uma contagem ímpar significa que o Base64 foi cortado ou não é UTF-16, e o byte que sobra vira o caractere de substituição.
Como decodificar um -EncodedCommand do PowerShell?
O valor depois de -EncodedCommand (ou -enc) é Base64 de UTF-16LE, então esta página o decodifica. O decodificador de PowerShell também aceita a linha de comando inteira e encontra payloads aninhados.