Как декодировать Base64 в UTF-16
- Вставьте Base64 в поле Ввод · Base64. В поле Кодировка уже выбран UTF-16LE.
- Текст появится в поле Результат · текст. В поле Похоже на обычно будет Binary: детектор считает нулевые байты признаком двоичных данных. Текстовый результат при этом правильный.
- Если вместо текста получилась строка иероглифов, переключите Кодировку на UTF-16BE.
- Если данные начинаются с метки порядка байтов, Автоопределение само выберет нужный порядок и уберёт метку.
- Скопировать результат копирует текст, Скачать сохраняет исходные байты.
Обратное преобразование делает страница UTF-16 в Base64.
Как узнать UTF-16 в Base64
У Base64 от UTF-16 заметный ритм. В ASCII-тексте в UTF-16 байты букв чередуются с нулевыми байтами, а нулевые биты в алфавите Base64 дают A, поэтому A встречается через каждые несколько символов:
| Base64 | Порядок байтов | Результат |
|---|---|---|
SABlAGwAbABvAA== | LE, без BOM | Hello |
AEgAZQBsAGwAbw== | BE, без BOM | Hello |
//5IAGkA | LE с BOM FF FE | Hi |
/v8ASABp | BE с BOM FE FF | Hi |
RwBlAHQALQBEAGEAdABlAA== | LE, без BOM | Get-Date |
ASCII-текст в big-endian всегда начинается с A, потому что первый байт нулевой. Строка, которая начинается с //4 или /v8, открывается меткой порядка байтов.
Порядок байтов, BOM и автоопределение
Если читать с неправильным порядком байтов, каждая пара байтов меняется местами, и английский текст превращается в иероглифы: AEgAZQBsAGwAbw==, декодированный как UTF-16LE, даёт 䠀攀氀氀漀. Данные при этом не теряются: достаточно переключить поле Кодировка.
Автоопределение надёжно распознаёт UTF-16, когда данные начинаются с BOM. Без BOM обычный ASCII-текст в UTF-16 корректен и как UTF-8 (нулевые байты там допустимы), поэтому автоматика может принять его за UTF-8 с невидимыми символами. На этой странице выбирайте UTF-16LE или UTF-16BE вручную, если в начале нет //4 или /v8.
Нечётное число байтов указывает на проблему. В SABpAAA= 5 байтов; как UTF-16LE он даёт Hi и � в конце. Значит, значение обрезано или это вообще не UTF-16.
Откуда берётся Base64 в UTF-16
Чаще всего из PowerShell. Закодированные команды вида powershell -enc SQBFAFgA... встречаются в планировщике заданий, скриптах установщиков и журналах безопасности, и Base64 в них всегда от UTF-16LE. Декодер PowerShell EncodedCommand вытаскивает значение из полной командной строки и ищет в скрипте вложенный Base64.
Base64 от UTF-16 встречается и в программах на .NET, которые вызывают Convert.ToBase64String(Encoding.Unicode.GetBytes(...)), в данных реестра и журналов событий Windows, а также в значениях NVARCHAR из SQL Server, выгруженных в двоичном виде.
Декодирование Base64 в UTF-16 в коде
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
На нечётном числе байтов Python выбрасывает UnicodeDecodeError: truncated data.
// 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"
В C# Encoding.Unicode.GetString(Convert.FromBase64String(s)) читает UTF-16LE, а Encoding.BigEndianUnicode читает big-endian. См. также Python и Node.js.
Вопросы и ответы
Как понять, что в Base64 закодирован UTF-16?
Ищите много символов A, идущих с правильной периодичностью, как в SABlAGwAbABvAA==: в UTF-16 рядом с каждой ASCII-буквой стоит нулевой байт. //4 или /v8 в начале строки означают метку порядка байтов (BOM) UTF-16.
Почему после декодирования получились китайские иероглифы?
Перепутан порядок байтов. Hello в big-endian, прочитанный как little-endian, превращается в 䠀攀氀氀漀. Переключите «Кодировку» между UTF-16LE и UTF-16BE.
Откуда символ � в конце текста?
В UTF-16 число байтов всегда чётное. Нечётное значит, что Base64 обрезан или это вовсе не UTF-16, и лишний байт превращается в символ замены.
Как декодировать PowerShell -EncodedCommand?
Значение после -EncodedCommand (или -enc) записано как Base64 от UTF-16LE, так что эта страница его декодирует. Декодер PowerShell принимает и командную строку целиком, а заодно находит вложенную полезную нагрузку.