如何将 Base64 解码为 UTF-16
- 把 Base64 粘贴到 输入 · Base64。字符集 已预设为 UTF-16LE。
- 在 输出 · 文本 中查看结果。看起来像 一栏通常会显示“二进制”,因为检测器把零字节视为二进制数据的特征;文本输出本身仍然是正确的。
- 如果结果是一串类似汉字的字符,把 字符集 切换为 UTF-16BE。
- 如果数据以字节序标记开头,自动检测 会选出正确的字节序并去掉该标记。
- 复制输出 复制文本;下载 保存原始字节。
反方向的转换请使用 UTF-16 转 Base64。
如何在 Base64 中认出 UTF-16
UTF-16 的 Base64 有明显的节奏感。UTF-16 中的 ASCII 文本是字母字节和零字节交替出现,而零比特在 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 文本总是以 A 开头,因为它的第一个字节是零。以 //4 或 /v8 开头的字符串带有字节序标记。
字节序、BOM 与自动检测
如果用错误的字节序读取,每对字节都会颠倒,英文就变成了汉字:AEgAZQBsAGwAbw== 按 UTF-16LE 解码得到 䠀攀氀氀漀。数据并没有丢失,切换 字符集 就能恢复。
数据以 BOM 开头时,自动检测 能可靠地识别 UTF-16。没有 BOM 时,UTF-16 中的纯 ASCII 文本同样是有效的 UTF-8(零字节在 UTF-8 中是合法的),因此自动检测可能把它误判为带不可见字符的 UTF-8。在本页上,除非开头是 //4 或 /v8,否则请手动保持选择 UTF-16LE 或 UTF-16BE。
字节数为奇数说明有问题。SABpAAA= 有 5 个字节,按 UTF-16LE 解码得到 Hi 和末尾的一个 �。要么值被截断了,要么它根本不是 UTF-16。
UTF-16 的 Base64 从哪里来
最常见的来源是 PowerShell。类似 powershell -enc SQBFAFgA... 的编码命令会出现在计划任务、安装脚本和安全日志中,其中的 Base64 一律是 UTF-16LE。PowerShell EncodedCommand 解码器 能从完整命令行中提取该值,并继续查找脚本里的其他 Base64。
其他来源包括调用 Convert.ToBase64String(Encoding.Unicode.GetBytes(...)) 的 .NET 程序、Windows 注册表和事件数据,以及以二进制形式导出的 SQL Server NVARCHAR 值。
在代码中解码 UTF-16 的 Base64
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 则按大端序读取。另请参阅 Python 和 Node.js。
常见问题
怎么判断 Base64 里是不是 UTF-16?
看是否有大量按固定规律出现的 A,例如 SABlAGwAbABvAA==:在 UTF-16 中,每个 ASCII 字母旁边都有一个零字节。开头是 //4 或 /v8 的,说明带有 UTF-16 字节序标记(BOM)。
为什么解码后出现一堆汉字?
字节序反了。大端序的 Hello 按小端序读取,就会变成 䠀攀氀氀漀。在“字符集”中切换 UTF-16LE 和 UTF-16BE 即可。
为什么文本末尾有一个 �?
UTF-16 的字节数必须是偶数。字节数为奇数,说明 Base64 被截断了,或者根本不是 UTF-16,多出的那个字节就变成了替换字符。
怎么解码 PowerShell 的 -EncodedCommand?
-EncodedCommand(或 -enc)后面的值是 UTF-16LE 的 Base64,本页可以直接解码。PowerShell 解码器 还能接受整条命令行,并找出嵌套的载荷。