Whiz Tools

Base64 Encoder/Decoder

Zet tekst om naar en van Base64-codering

Kopiëren

Base64 Encoder en Decoder

Inleiding

Base64 is een binaire-naar-tekst codering schema dat binaire gegevens voorstelt in een ASCII tekenreeks formaat. Het is ontworpen om gegevens die zijn opgeslagen in binaire formaten over te dragen via kanalen die alleen betrouwbaar tekstinhoud ondersteunen. Base64 codering converteert binaire gegevens in een set van 64 tekens (vandaar de naam) die veilig kunnen worden verzonden via tekstgebaseerde protocollen zonder gegevenscorruptie.

De Base64 tekenreeks bestaat uit:

  • Hoofdletters A-Z (26 tekens)
  • Kleine letters a-z (26 tekens)
  • Cijfers 0-9 (10 tekens)
  • Twee extra tekens, meestal "+" en "/" (2 tekens)

Deze tool stelt je in staat om eenvoudig tekst naar Base64 formaat te coderen of Base64 tekenreeksen terug te decoderen naar hun oorspronkelijke tekst. Het is bijzonder nuttig voor ontwikkelaars, IT-professionals en iedereen die werkt met gegevens die veilig moeten worden verzonden via tekstgebaseerde kanalen.

Hoe Base64 Codering Werkt

Codering Proces

Base64 codering werkt door elke groep van drie bytes (24 bits) binaire gegevens om te zetten in vier Base64 tekens. Het proces volgt deze stappen:

  1. Converteer de invoertekst naar zijn binaire representatie (met behulp van ASCII of UTF-8 codering)
  2. Groepeer de binaire gegevens in stukken van 24 bits (3 bytes)
  3. Splits elke 24-bits chunk in vier 6-bits groepen
  4. Converteer elke 6-bits groep naar het bijbehorende Base64 teken

Wanneer de invoerlengte niet deelbaar is door 3, wordt er padding toegevoegd met "=" tekens om de 4:3 verhouding van uitvoer naar invoerlengtes te behouden.

Wiskundige Representatie

Voor een reeks bytes b1,b2,b3b_1, b_2, b_3, worden de overeenkomstige Base64 tekens c1,c2,c3,c4c_1, c_2, c_3, c_4 berekend als:

c1=Base64[(b1>>2)]c_1 = \text{Base64}[(b_1 >> 2)] c2=Base64[((b1&3)<<4)(b2>>4)]c_2 = \text{Base64}[((b_1 \& 3) << 4) | (b_2 >> 4)] c3=Base64[((b2&15)<<2)(b3>>6)]c_3 = \text{Base64}[((b_2 \& 15) << 2) | (b_3 >> 6)] c4=Base64[(b3&63)]c_4 = \text{Base64}[(b_3 \& 63)]

Waar Base64[i]\text{Base64}[i] het ii-de teken in het Base64 alfabet vertegenwoordigt.

Decodering Proces

Base64 decodering keert het codering proces om:

  1. Converteer elk Base64 teken naar zijn 6-bits waarde
  2. Concateneer deze 6-bits waarden
  3. Groepeer de bits in 8-bits stukken (bytes)
  4. Converteer elke byte naar het bijbehorende teken

Padding

Wanneer het aantal bytes dat gecodeerd moet worden niet deelbaar is door 3, wordt padding toegepast:

  • Als er één byte overblijft, wordt deze omgezet in twee Base64 tekens gevolgd door "=="
  • Als er twee bytes overblijven, worden ze omgezet in drie Base64 tekens gevolgd door "="

Voorbeeld

Laten we de tekst "Hallo" naar Base64 coderen:

  1. ASCII representatie van "Hallo": 72 101 108 108 111
  2. Binaire representatie: 01001000 01100101 01101100 01101100 01101111
  3. Groeperen in 6-bits chunks: 010010 000110 010101 101100 011011 000110 1111
  4. De laatste chunk heeft slechts 4 bits, dus we vullen aan met nullen: 010010 000110 010101 101100 011011 000110 111100
  5. Omzetten naar decimaal: 18, 6, 21, 44, 27, 6, 60
  6. Opzoeken in het Base64 alfabet: S, G, V, s, b, G, 8
  7. Het resultaat is "SGVsbG8="

Let op de "=" padding aan het einde omdat de invoerlengte (5 bytes) niet deelbaar is door 3.

Formule

De algemene formule voor het berekenen van de lengte van een Base64 gecodeerde tekenreeks is:

encoded_length=4×input_length3\text{encoded\_length} = 4 \times \lceil \frac{\text{input\_length}}{3} \rceil

Waar x\lceil x \rceil de plafondfunctie vertegenwoordigt (afgerond naar het dichtstbijzijnde gehele getal).

Toepassingen

Base64 codering wordt op grote schaal gebruikt in verschillende toepassingen:

  1. E-mailbijlagen: MIME (Multipurpose Internet Mail Extensions) gebruikt Base64 om binaire bijlagen in e-mail te coderen.

  2. Data-URL's: Kleine afbeeldingen, lettertypen of andere bronnen direct in HTML, CSS of JavaScript insluiten met behulp van het data: URL-schema.

  3. API-communicatie: Veilig verzenden van binaire gegevens in JSON-payloads of andere tekstgebaseerde API-formaten.

  4. Opslaan van Binaire Gegevens in Tekstformaten: Wanneer binaire gegevens moeten worden opgeslagen in XML, JSON of andere tekstgebaseerde formaten.

  5. Authentificatiesystemen: Basisauthenticatie in HTTP gebruikt Base64 codering (hoewel het niet voor beveiliging is, alleen voor codering).

  6. Cryptografie: Als onderdeel van verschillende cryptografische protocollen en systemen, vaak voor het coderen van sleutels of certificaten.

  7. Cookie-waarden: Complexe datastructuren coderen om in cookies op te slaan.

Alternatieven

Hoewel Base64 veel wordt gebruikt, zijn er alternatieven die in bepaalde situaties geschikter kunnen zijn:

  1. URL-veilige Base64: Een variant die "-" en "_" gebruikt in plaats van "+" en "/" om problemen met URL-codering te vermijden. Nuttig voor gegevens die in URL's moeten worden opgenomen.

  2. Base32: Gebruikt een 32-teken set, wat resulteert in een langere uitvoer maar met betere leesbaarheid en hoofdlettergevoeligheid.

  3. Hex Codering: Eenvoudige conversie naar hexadecimaal, wat minder efficiënt is (verdubbelt de grootte) maar heel eenvoudig en breed ondersteund.

  4. Binaire Overdracht: Voor grote bestanden of wanneer efficiëntie cruciaal is, zijn directe binaire overdracht protocollen zoals HTTP met de juiste Content-Type headers te verkiezen.

  5. Compressie + Base64: Voor grote tekstgegevens kan compressie vóór codering de groottevergroting verminderen.

  6. JSON/XML Serialisatie: Voor gestructureerde gegevens kan het gebruik van native JSON of XML serialisatie geschikter zijn dan Base64 codering.

Geschiedenis

Base64 codering heeft zijn oorsprong in vroege computer- en telecommunicatiesystemen waar binaire gegevens over kanalen moesten worden verzonden die voor tekst waren ontworpen.

De formele specificatie van Base64 werd voor het eerst gepubliceerd in 1987 als onderdeel van RFC 989, dat Privacy Enhanced Mail (PEM) definieerde. Dit werd later bijgewerkt in RFC 1421 (1993) en RFC 2045 (1996, als onderdeel van MIME).

De term "Base64" komt van het feit dat de codering 64 verschillende ASCII-tekens gebruikt om binaire gegevens voor te stellen. Deze keuze van 64 tekens was opzettelijk, omdat 64 een macht van 2 is (2^6), wat de conversie tussen binaire en Base64 efficiënt maakt.

In de loop der tijd zijn er verschillende varianten van Base64 ontstaan:

  • Standaard Base64: Zoals gedefinieerd in RFC 4648, met gebruik van A-Z, a-z, 0-9, +, / en = voor padding
  • URL-veilige Base64: Gebruikt - en _ in plaats van + en / om problemen met URL-codering te vermijden
  • Bestandsnaam-veilige Base64: Vergelijkbaar met URL-veilige, ontworpen voor gebruik in bestandsnamen
  • Aangepaste Base64 voor IMAP: Gebruikt in het IMAP-protocol met een andere set speciale tekens

Ondanks dat het meer dan drie decennia oud is, blijft Base64 een fundamenteel hulpmiddel in de moderne informatica, vooral met de opkomst van webapplicaties en API's die sterk afhankelijk zijn van tekstgebaseerde gegevensformaten zoals JSON.

Code Voorbeelden

Hier zijn voorbeelden van Base64 codering en decodering in verschillende programmeertalen:

// JavaScript Base64 Codering/Decodering
function encodeToBase64(text) {
  return btoa(text);
}

function decodeFromBase64(base64String) {
  try {
    return atob(base64String);
  } catch (e) {
    throw new Error("Ongeldige Base64 tekenreeks");
  }
}

// Voorbeeld gebruik
const originalText = "Hallo, Wereld!";
const encoded = encodeToBase64(originalText);
console.log("Gecodeerd:", encoded);  // SGVsbG8sIFdvcmxkIQ==

try {
  const decoded = decodeFromBase64(encoded);
  console.log("Gedecodeerd:", decoded);  // Hallo, Wereld!
} catch (error) {
  console.error(error.message);
}
# Python Base64 Codering/Decodering
import base64

def encode_to_base64(text):
    # Converteer string naar bytes en encode
    text_bytes = text.encode('utf-8')
    base64_bytes = base64.b64encode(text_bytes)
    return base64_bytes.decode('utf-8')

def decode_from_base64(base64_string):
    try:
        # Converteer base64 string naar bytes en decode
        base64_bytes = base64_string.encode('utf-8')
        text_bytes = base64.b64decode(base64_bytes)
        return text_bytes.decode('utf-8')
    except Exception as e:
        raise ValueError(f"Ongeldige Base64 tekenreeks: {e}")

# Voorbeeld gebruik
original_text = "Hallo, Wereld!"
encoded = encode_to_base64(original_text)
print(f"Gecodeerd: {encoded}")  # SGVsbG8sIFdvcmxkIQ==

try:
    decoded = decode_from_base64(encoded)
    print(f"Gedecodeerd: {decoded}")  # Hallo, Wereld!
except ValueError as e:
    print(e)
// Java Base64 Codering/Decodering
import java.util.Base64;
import java.nio.charset.StandardCharsets;

public class Base64Example {
    public static String encodeToBase64(String text) {
        byte[] textBytes = text.getBytes(StandardCharsets.UTF_8);
        byte[] encodedBytes = Base64.getEncoder().encode(textBytes);
        return new String(encodedBytes, StandardCharsets.UTF_8);
    }
    
    public static String decodeFromBase64(String base64String) {
        try {
            byte[] base64Bytes = base64String.getBytes(StandardCharsets.UTF_8);
            byte[] decodedBytes = Base64.getDecoder().decode(base64Bytes);
            return new String(decodedBytes, StandardCharsets.UTF_8);
        } catch (IllegalArgumentException e) {
            throw new IllegalArgumentException("Ongeldige Base64 tekenreeks: " + e.getMessage());
        }
    }
    
    public static void main(String[] args) {
        String originalText = "Hallo, Wereld!";
        String encoded = encodeToBase64(originalText);
        System.out.println("Gecodeerd: " + encoded);  // SGVsbG8sIFdvcmxkIQ==
        
        try {
            String decoded = decodeFromBase64(encoded);
            System.out.println("Gedecodeerd: " + decoded);  // Hallo, Wereld!
        } catch (IllegalArgumentException e) {
            System.err.println(e.getMessage());
        }
    }
}
<?php
// PHP Base64 Codering/Decodering
function encodeToBase64($text) {
    return base64_encode($text);
}

function decodeFromBase64($base64String) {
    $decoded = base64_decode($base64String, true);
    if ($decoded === false) {
        throw new Exception("Ongeldige Base64 tekenreeks");
    }
    return $decoded;
}

// Voorbeeld gebruik
$originalText = "Hallo, Wereld!";
$encoded = encodeToBase64($originalText);
echo "Gecodeerd: " . $encoded . "\n";  // SGVsbG8sIFdvcmxkIQ==

try {
    $decoded = decodeFromBase64($encoded);
    echo "Gedecodeerd: " . $decoded . "\n";  // Hallo, Wereld!
} catch (Exception $e) {
    echo "Fout: " . $e->getMessage() . "\n";
}
?>
// C# Base64 Codering/Decodering
using System;
using System.Text;

class Base64Example
{
    public static string EncodeToBase64(string text)
    {
        byte[] textBytes = Encoding.UTF8.GetBytes(text);
        return Convert.ToBase64String(textBytes);
    }
    
    public static string DecodeFromBase64(string base64String)
    {
        try
        {
            byte[] base64Bytes = Convert.FromBase64String(base64String);
            return Encoding.UTF8.GetString(base64Bytes);
        }
        catch (FormatException)
        {
            throw new FormatException("Ongeldige Base64 tekenreeks");
        }
    }
    
    static void Main()
    {
        string originalText = "Hallo, Wereld!";
        string encoded = EncodeToBase64(originalText);
        Console.WriteLine($"Gecodeerd: {encoded}");  // SGVsbG8sIFdvcmxkIQ==
        
        try
        {
            string decoded = DecodeFromBase64(encoded);
            Console.WriteLine($"Gedecodeerd: {decoded}");  // Hallo, Wereld!
        }
        catch (FormatException e)
        {
            Console.WriteLine($"Fout: {e.Message}");
        }
    }
}
# Ruby Base64 Codering/Decodering
require 'base64'

def encode_to_base64(text)
  Base64.strict_encode64(text)
end

def decode_from_base64(base64_string)
  begin
    Base64.strict_decode64(base64_string)
  rescue ArgumentError => e
    raise "Ongeldige Base64 tekenreeks: #{e.message}"
  end
end

# Voorbeeld gebruik
original_text = "Hallo, Wereld!"
encoded = encode_to_base64(original_text)
puts "Gecodeerd: #{encoded}"  # SGVsbG8sIFdvcmxkIQ==

begin
  decoded = decode_from_base64(encoded)
  puts "Gedecodeerd: #{decoded}"  # Hallo, Wereld!
rescue StandardError => e
  puts "Fout: #{e.message}"
end
// Go Base64 Codering/Decodering
package main

import (
    "encoding/base64"
    "fmt"
)

func encodeToBase64(text string) string {
    return base64.StdEncoding.EncodeToString([]byte(text))
}

func decodeFromBase64(base64String string) (string, error) {
    bytes, err := base64.StdEncoding.DecodeString(base64String)
    if err != nil {
        return "", fmt.Errorf("ongeldige Base64 tekenreeks: %v", err)
    }
    return string(bytes), nil
}

func main() {
    originalText := "Hallo, Wereld!"
    encoded := encodeToBase64(originalText)
    fmt.Println("Gecodeerd:", encoded)  // SGVsbG8sIFdvcmxkIQ==
    
    decoded, err := decodeFromBase64(encoded)
    if err != nil {
        fmt.Println("Fout:", err)
    } else {
        fmt.Println("Gedecodeerd:", decoded)  // Hallo, Wereld!
    }
}
// Swift Base64 Codering/Decodering
import Foundation

func encodeToBase64(_ text: String) -> String? {
    if let data = text.data(using: .utf8) {
        return data.base64EncodedString()
    }
    return nil
}

func decodeFromBase64(_ base64String: String) -> String? {
    if let data = Data(base64Encoded: base64String) {
        return String(data: data, encoding: .utf8)
    }
    return nil
}

// Voorbeeld gebruik
let originalText = "Hallo, Wereld!"
if let encoded = encodeToBase64(originalText) {
    print("Gecodeerd: \(encoded)")  // SGVsbG8sIFdvcmxkIQ==
    
    if let decoded = decodeFromBase64(encoded) {
        print("Gedecodeerd: \(decoded)")  // Hallo, Wereld!
    } else {
        print("Fout: Kon Base64 tekenreeks niet decoderen")
    }
} else {
    print("Fout: Kon tekst niet coderen")
}
' Excel VBA Base64 Codering/Decodering
' Opmerking: Dit vereist een referentie naar Microsoft XML, v6.0
Function EncodeToBase64(text As String) As String
    Dim xmlObj As Object
    Set xmlObj = CreateObject("MSXML2.DOMDocument")
    
    Dim xmlNode As Object
    Set xmlNode = xmlObj.createElement("b64")
    
    xmlNode.DataType = "bin.base64"
    xmlNode.nodeTypedValue = StrConv(text, vbFromUnicode)
    
    EncodeToBase64 = xmlNode.text
    
    Set xmlNode = Nothing
    Set xmlObj = Nothing
End Function

Function DecodeFromBase64(base64String As String) As String
    On Error GoTo ErrorHandler
    
    Dim xmlObj As Object
    Set xmlObj = CreateObject("MSXML2.DOMDocument")
    
    Dim xmlNode As Object
    Set xmlNode = xmlObj.createElement("b64")
    
    xmlNode.DataType = "bin.base64"
    xmlNode.text = base64String
    
    DecodeFromBase64 = StrConv(xmlNode.nodeTypedValue, vbUnicode)
    
    Set xmlNode = Nothing
    Set xmlObj = Nothing
    Exit Function
    
ErrorHandler:
    DecodeFromBase64 = "Fout: Ongeldige Base64 tekenreeks"
End Function

' Gebruik in een werkblad:
' =EncodeToBase64("Hallo, Wereld!")
' =DecodeFromBase64("SGVsbG8sIFdvcmxkIQ==")
# R Base64 Codering/Decodering
# Vereist het 'base64enc' pakket
# install.packages("base64enc")
library(base64enc)

encode_to_base64 <- function(text) {
  # Converteer tekst naar ruwe bytes, dan coderen
  text_raw <- charToRaw(text)
  base64_encoded <- base64encode(text_raw)
  return(rawToChar(base64_encoded))
}

decode_from_base64 <- function(base64_string) {
  tryCatch({
    # Converteer base64 tekenreeks naar ruwe, dan decoderen
    base64_raw <- charToRaw(base64_string)
    decoded_raw <- base64decode(base64_raw)
    return(rawToChar(decoded_raw))
  }, error = function(e) {
    stop(paste("Ongeldige Base64 tekenreeks:", e$message))
  })
}

# Voorbeeld gebruik
original_text <- "Hallo, Wereld!"
encoded <- encode_to_base64(original_text)
cat("Gecodeerd:", encoded, "\n")  # SGVsbG8sIFdvcmxkIQ==

tryCatch({
  decoded <- decode_from_base64(encoded)
  cat("Gedecodeerd:", decoded, "\n")  # Hallo, Wereld!
}, error = function(e) {
  cat("Fout:", e$message, "\n")
})
% MATLAB Base64 Codering/Decodering
function demo_base64()
    originalText = 'Hallo, Wereld!';
    
    % Coderen
    encoded = encode_to_base64(originalText);
    fprintf('Gecodeerd: %s\n', encoded);  % SGVsbG8sIFdvcmxkIQ==
    
    % Decoderen
    try
        decoded = decode_from_base64(encoded);
        fprintf('Gedecodeerd: %s\n', decoded);  % Hallo, Wereld!
    catch e
        fprintf('Fout: %s\n', e.message);
    end
end

function encoded = encode_to_base64(text)
    % Converteer tekst naar uint8 array en coderen
    bytes = uint8(text);
    encoded = base64encode(bytes);
end

function decoded = decode_from_base64(base64String)
    try
        % Decodeer base64 tekenreeks naar uint8 array
        bytes = base64decode(base64String);
        decoded = char(bytes);
    catch
        error('Ongeldige Base64 tekenreeks');
    end
end
// C Base64 Codering/Decodering met OpenSSL
#include <stdio.h>
#include <string.h>
#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/buffer.h>
#include <stdint.h>

char* encode_to_base64(const char* input) {
    BIO *bio, *b64;
    BUF_MEM *bufferPtr;
    
    b64 = BIO_new(BIO_f_base64());
    bio = BIO_new(BIO_s_mem());
    bio = BIO_push(b64, bio);
    
    BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);
    BIO_write(bio, input, strlen(input));
    BIO_flush(bio);
    BIO_get_mem_ptr(bio, &bufferPtr);
    
    char* result = (char*)malloc(bufferPtr->length + 1);
    memcpy(result, bufferPtr->data, bufferPtr->length);
    result[bufferPtr->length] = '\0';
    
    BIO_free_all(bio);
    
    return result;
}

char* decode_from_base64(const char* input) {
    BIO *bio, *b64;
    size_t length = strlen(input);
    char* buffer = (char*)malloc(length);
    
    b64 = BIO_new(BIO_f_base64());
    bio = BIO_new_mem_buf(input, -1);
    bio = BIO_push(b64, bio);
    
    BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);
    int decoded_length = BIO_read(bio, buffer, length);
    
    if (decoded_length <= 0) {
        free(buffer);
        BIO_free_all(bio);
        return NULL; // Ongeldige Base64 invoer
    }
    
    buffer[decoded_length] = '\0';
    
    BIO_free_all(bio);
    
    return buffer;
}

int main() {
    const char* original_text = "Hallo, Wereld!";
    
    char* encoded = encode_to_base64(original_text);
    printf("Gecodeerd: %s\n", encoded);  // SGVsbG8sIFdvcmxkIQ==
    
    char* decoded = decode_from_base64(encoded);
    if (decoded) {
        printf("Gedecodeerd: %s\n", decoded);  // Hallo, Wereld!
        free(decoded);
    } else {
        printf("Fout: Ongeldige Base64 tekenreeks\n");
    }
    
    free(encoded);
    
    return 0;
}
// Rust Base64 Codering/Decodering
use base64::{encode, decode};
use std::str;

fn encode_to_base64(text: &str) -> String {
    encode(text)
}

fn decode_from_base64(base64_string: &str) -> Result<String, String> {
    match decode(base64_string) {
        Ok(bytes) => {
            match str::from_utf8(&bytes) {
                Ok(text) => Ok(text.to_string()),
                Err(e) => Err(format!("Ongeldige UTF-8 reeks: {}", e))
            }
        },
        Err(e) => Err(format!("Ongeldige Base64 tekenreeks: {}", e))
    }
}

fn main() {
    let original_text = "Hallo, Wereld!";
    let encoded = encode_to_base64(original_text);
    println!("Gecodeerd: {}", encoded);  // SGVsbG8sIFdvcmxkIQ==
    
    match decode_from_base64(&encoded) {
        Ok(decoded) => println!("Gedecodeerd: {}", decoded),  // Hallo, Wereld!
        Err(e) => println!("Fout: {}", e)
    }
}

Randgevallen en Overwegingen

Bij het werken met Base64 codering en decodering, wees je bewust van deze belangrijke overwegingen:

  1. Unicode en Niet-ASCII Tekens: Bij het coderen van tekst met niet-ASCII tekens, zorg voor de juiste tekencodering (meestal UTF-8) vóór Base64 codering.

  2. Padding: Standaard Base64 gebruikt padding met "=" tekens om ervoor te zorgen dat de uitvoerlengte een veelvoud van 4 is. Sommige implementaties staan het weglaten van padding toe, wat compatibiliteitsproblemen kan veroorzaken.

  3. Regelafbrekingen: Traditionele Base64 implementaties voegen regelafbrekingen in (meestal elke 76 tekens) voor leesbaarheid, maar moderne toepassingen omzeilen deze vaak.

  4. URL-Veilige Base64: Standaard Base64 gebruikt "+" en "/" tekens die speciale betekenissen hebben in URL's. Voor URL-contexten, gebruik URL-veilige Base64 die deze vervangt door "-" en "_".

  5. Witruimte: Bij decoderen zijn sommige implementaties soepel en negeren ze witruimte, terwijl andere exacte invoer vereisen.

  6. Grootte Verhoging: Base64 codering verhoogt de grootte van gegevens met ongeveer 33% (4 uitvoerbytes voor elke 3 invoerbytes).

  7. Prestaties: Base64 codering/decodering kan rekenintensief zijn voor zeer grote gegevens. Overweeg streaming benaderingen voor grote bestanden.

Referenties

  1. RFC 4648 - De Base16, Base32, en Base64 Gegevenscoderingen
  2. RFC 2045 - MIME Deel Eén: Formaat van Internetberichtlichamen
  3. MDN Web Docs: Base64 codering en decodering
  4. Base64 - Wikipedia
  5. MIME - Wikipedia
Feedback