[CODE] Base64 in JavaScript
Praktische JavaScript-Beispiele für Base64-Kodierung und -Dekodierung mit modernen Browser-APIs.
// GRUNDLEGENDE KODIERUNG & DEKODIERUNG
JavaScript bietet eingebaute Funktionen für Base64-Operationen. Die Funktionen btoa() und atob() handhaben grundlegende Kodierung und Dekodierung:
Diese Funktionen funktionieren großartig für ASCII-Text, erfordern aber spezielle Behandlung für Unicode-Zeichen.
// Grundlegende Base64-Kodierung
const text = 'Hallo Welt';
const encoded = btoa(text);
console.log(encoded); // SGFsbG8gV2VsdA==
// Grundlegende Base64-Dekodierung
const decoded = atob(encoded);
console.log(decoded); // Hallo Welt
// Prüfen, ob String gültiges Base64 ist
function isValidBase64(str) {
try {
return btoa(atob(str)) === str;
} catch (err) {
return false;
}
}
// UNICODE-UNTERSTÜTZUNG
Für Unicode-Strings müssen wir zuerst in UTF-8-Bytes konvertieren. Moderne Browser bieten TextEncoder- und TextDecoder-APIs:
Dieser Ansatz behandelt Emojis, internationale Zeichen und anderen Unicode-Inhalt korrekt.
// Unicode-sichere Base64-Kodierung
function encodeBase64(str) {
const encoder = new TextEncoder();
const bytes = encoder.encode(str);
const binary = String.fromCharCode(...bytes);
return btoa(binary);
}
// Unicode-sichere Base64-Dekodierung
function decodeBase64(base64) {
const binary = atob(base64);
const bytes = new Uint8Array(binary.length);
for (let i = 0; i < binary.length; i++) {
bytes[i] = binary.charCodeAt(i);
}
const decoder = new TextDecoder();
return decoder.decode(bytes);
}
// Beispiel mit Emoji
const emoji = 'Hallo 👋 Welt 🌍';
const encoded = encodeBase64(emoji);
const decoded = decodeBase64(encoded);
console.log(decoded); // Hallo 👋 Welt 🌍
// DATEIBEHANDLUNG
Das Konvertieren von Dateien zu Base64 ist üblich für Uploads und Daten-URIs. Verwenden Sie die FileReader-API für clientseitige Dateiverarbeitung:
Dies erstellt Daten-URIs, die direkt in HTML eingebettet oder an APIs gesendet werden können.
// Datei zu Base64-Daten-URI konvertieren
function fileToBase64(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => resolve(reader.result);
reader.onerror = error => reject(error);
reader.readAsDataURL(file);
});
}
// Verwendung mit Datei-Input
document.getElementById('fileInput').addEventListener('change', async (e) => {
const file = e.target.files[0];
if (file) {
try {
const base64 = await fileToBase64(file);
console.log(base64);
// Ergebnis: data:image/png;base64,iVBORw0KGgoAAAA...
} catch (error) {
console.error('Fehler:', error);
}
}
});
// URL-SICHERES BASE64
Standard-Base64 verwendet + und /-Zeichen, die URL-Kodierung benötigen. URL-sicheres Base64 ersetzt diese durch - und _:
Dies ist wichtig für Token, IDs und andere Daten, die über URLs übertragen werden.
// Zu URL-sicherem Base64 konvertieren
function toUrlSafeBase64(base64) {
return base64
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=/g, '');
}
// Von URL-sicherem Base64 konvertieren
function fromUrlSafeBase64(urlSafeBase64) {
let base64 = urlSafeBase64
.replace(/-/g, '+')
.replace(/_/g, '/');
// Padding hinzufügen falls nötig
const padding = 4 - (base64.length % 4);
if (padding !== 4) {
base64 += '='.repeat(padding);
}
return base64;
}
// Beispiel
const text = 'URL-sichere Kodierung Test';
const encoded = btoa(text);
const urlSafe = toUrlSafeBase64(encoded);
console.log(urlSafe); // VVJMLXNPY2hlcmUgS29kaWVydW5nIFRlc3Q
// STREAMING GROSSER DATEN
Für große Dateien oder Datenströme verarbeiten Sie in Chunks, um Speicherprobleme zu vermeiden:
Dieser Ansatz verhindert Browser-Einfrieren und behandelt große Datensätze effizient.
// Stream-basierte Base64-Kodierung
class Base64Encoder {
constructor() {
this.buffer = '';
}
encode(chunk) {
this.buffer += chunk;
const completeBytes = Math.floor(this.buffer.length / 3) * 3;
const toEncode = this.buffer.slice(0, completeBytes);
this.buffer = this.buffer.slice(completeBytes);
return btoa(toEncode);
}
flush() {
if (this.buffer.length > 0) {
const result = btoa(this.buffer);
this.buffer = '';
return result;
}
return '';
}
}
// Verwendung
const encoder = new Base64Encoder();
let result = '';
result += encoder.encode('Erster Chunk');
result += encoder.encode(' Zweiter Chunk');
result += encoder.flush();
console.log(result);
// FEHLERBEHANDLUNG
Implementieren Sie immer ordnungsgemäße Fehlerbehandlung für Base64-Operationen:
Robuste Fehlerbehandlung verhindert Anwendungsabstürze und bietet bessere Benutzererfahrung.
// Sichere Base64-Operationen mit Fehlerbehandlung
function safeEncode(input) {
try {
if (typeof input !== 'string') {
throw new Error('Eingabe muss ein String sein');
}
return btoa(input);
} catch (error) {
console.error('Kodierungsfehler:', error.message);
return null;
}
}
function safeDecode(base64) {
try {
// Base64-Format validieren
if (!/^[A-Za-z0-9+/]*={0,2}$/.test(base64)) {
throw new Error('Ungültiges Base64-Format');
}
return atob(base64);
} catch (error) {
console.error('Dekodierungsfehler:', error.message);
return null;
}
}
// Verwendung
const encoded = safeEncode('Hallo Welt');
const decoded = safeDecode(encoded);
if (encoded && decoded) {
console.log('Erfolg:', decoded);
}