So kodieren Sie Text als UTF-16-Base64
- Tippen oder fügen Sie Ihren Text in Eingabe · Text ein. Zeichensatz ist auf UTF-16LE voreingestellt.
- Kopieren Sie das Base64 aus Ausgabe · Base64. Die Angabe Eingabe zeigt die Anzahl der UTF-16-Bytes, doppelt so viel wie bei einfachem englischem Text.
- Für einen Big-Endian-Empfänger stellen Sie Zeichensatz auf UTF-16BE.
- Tauschen dekodiert das Ergebnis für eine schnelle Kontrolle wieder; Base64 in UTF-16 ist der eigentliche Decoder.
UTF-16LE und UTF-16BE
UTF-16 speichert jedes Zeichen als eine oder zwei 16-Bit-Code-Einheiten. Little-Endian schreibt das niederwertige Byte zuerst, Big-Endian das höherwertige. Windows und .NET verwenden Little-Endian; Javas Encoder UTF-16 und viele Netzwerkformate verwenden Big-Endian.
| Text | UTF-16LE-Bytes | UTF-16LE-Base64 | UTF-16BE-Base64 |
|---|---|---|---|
Hi | 48 00 69 00 | SABpAA== | AEgAaQ== |
Hello | 10 Bytes | SABlAGwAbABvAA== | AEgAZQBsAGwAbw== |
€ | AC 20 | rCA= | IKw= |
👋 | 3D D8 4B DC | PdhL3A== | 2D3cSw== |
Zeichen außerhalb der Basic Multilingual Plane, darunter alle Emoji, belegen zwei Code-Einheiten, ein sogenanntes Surrogate-Paar. 👋 (U+1F44B) wird zu D83D DC4B, das sind die 4 Bytes in der letzten Zeile.
Da jeder ASCII-Buchstabe mit einem Null-Byte gepaart ist, ist UTF-16-Base64 englischen Texts mit A-Zeichen durchsetzt. Eine unbekannte Zeichenkette mit diesem Muster sollten Sie als UTF-16 dekodieren.
Wo UTF-16-Base64 verwendet wird
- PowerShell
-EncodedCommand.powershell -EncodedCommand RwBlAHQALQBEAGEAdABlAA==führtGet-Dateaus. Ein häufiger Grund, warum solche Befehle scheitern, ist ein als UTF-8 kodiertes Skript. Das PowerShell-EncodedCommand-Tool ergänzt das Befehlspräfix, warnt vor dem Längenlimit voncmd.exeund dekodiert auch Befehle aus Logs. - .NET-Code.
Encoding.Unicodein C# ist UTF-16LE, daher erzeugtConvert.ToBase64String(Encoding.Unicode.GetBytes(s))dieselbe Ausgabe wie diese Seite. - Windows-Daten. Strings aus der Registry, aus
NVARCHAR-Spalten, die in SQL Server nach Binär gecastet wurden, und aus vielen Windows-APIs sind UTF-16LE.
Byte-Order-Marks
Dieses Tool schreibt keine Byte-Order-Mark, und genau das wollen PowerShell und die meisten APIs. Manche Bibliotheken fügen automatisch eine hinzu:
| Quelle | Erste Bytes | Base64 von Hi |
|---|---|---|
| Dieses Tool, UTF-16LE | 48 00 | SABpAA== |
Python "Hi".encode("utf-16") | FF FE 48 00 | //5IAGkA |
Java "Hi".getBytes(UTF_16) | FE FF 00 48 | /v8ASABp |
Muss Ihr Base64 mit einer dieser Varianten übereinstimmen, kodieren Sie im Code mit ausdrücklicher Byte-Reihenfolge, wie unten gezeigt.
UTF-16 in Base64 im Code
import base64
base64.b64encode("Get-Date".encode("utf-16-le")).decode() # 'RwBlAHQALQBEAGEAdABlAA=='
base64.b64encode("Hi".encode("utf-16-be")).decode() # 'AEgAaQ=='
// Node.js has a little-endian codec only
Buffer.from("Get-Date", "utf16le").toString("base64"); // "RwBlAHQALQBEAGEAdABlAA=="
[Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes('Get-Date'))
Verwenden Sie in Python utf-16-le statt utf-16, es sei denn, Sie wollen die BOM. Weitere Beispiele: Python, Node.js.
Häufige Fragen
Warum braucht PowerShell UTF-16LE-Base64?
powershell -EncodedCommand erwartet das Base64 der UTF-16LE-Bytes des Skripts, weil Windows Strings intern so speichert. UTF-8-Base64 wird zu den falschen Zeichen dekodiert, und der Befehl schlägt fehl. Das PowerShell-EncodedCommand-Tool baut die ganze Befehlszeile.
Was ist der Unterschied zwischen UTF-16LE und UTF-16BE?
Die Reihenfolge der beiden Bytes in jeder Code-Einheit. H ist in Little-Endian 48 00 und in Big-Endian 00 48, Hi wird also als SABpAA== bzw. AEgAaQ== kodiert.
Beginnt die Ausgabe mit einer Byte-Order-Mark?
Nein, kodiert werden nur die Bytes des Texts selbst. Pythons Codec "utf-16" und Javas Zeichensatz UTF_16 fügen eine hinzu, deshalb beginnt deren Base64 mit //5 oder /v8.
Warum ist UTF-16-Base64 so lang?
UTF-16 verwendet mindestens 2 Bytes pro Zeichen, englischer Text verdoppelt sich also, bevor Base64 sein Drittel draufschlägt. Hello hat in UTF-8 8 Base64-Zeichen und in UTF-16 16.