Whiz Tools

Base64 Encoder/Decoder

Konverter tekst til og fra Base64 kodning

Kopier

Base64 Encoder og Decoder

Introduktion

Base64 er et binært-til-tekst kodningsskema, der repræsenterer binære data i et ASCII-strengformat. Det er designet til at transportere data, der er gemt i binære formater, over kanaler, der kun pålideligt understøtter tekstindhold. Base64 kodning konverterer binære data til et sæt af 64 tegn (deraf navnet), som kan overføres sikkert over tekstbaserede protokoller uden datakorruption.

Base64-tegnsættet består af:

  • Store bogstaver A-Z (26 tegn)
  • Små bogstaver a-z (26 tegn)
  • Cifrene 0-9 (10 tegn)
  • To ekstra tegn, typisk "+" og "/" (2 tegn)

Dette værktøj giver dig mulighed for nemt at kode tekst til Base64-format eller dekode Base64-strenge tilbage til deres oprindelige tekst. Det er særligt nyttigt for udviklere, IT-professionelle og alle, der arbejder med data, der skal overføres sikkert over tekstbaserede kanaler.

Hvordan Base64 Kodning Fungerer

Kodningsproces

Base64 kodning fungerer ved at konvertere hver gruppe af tre bytes (24 bits) af binære data til fire Base64-tegn. Processen følger disse trin:

  1. Konverter den indtastede tekst til dens binære repræsentation (ved hjælp af ASCII eller UTF-8 kodning)
  2. Gruppér de binære data i klumper af 24 bits (3 bytes)
  3. Del hver 24-bit klump op i fire 6-bit grupper
  4. Konverter hver 6-bit gruppe til det tilsvarende Base64-tegn

Når længden af input ikke er delelig med 3, tilføjes polstring med "=" tegn for at opretholde forholdet 4:3 mellem output- og inputlængder.

Matematisk Repræsentation

For en sekvens af bytes b1,b2,b3b_1, b_2, b_3, beregnes de tilsvarende Base64-tegn c1,c2,c3,c4c_1, c_2, c_3, c_4 som:

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)]

Hvor Base64[i]\text{Base64}[i] repræsenterer det ii-te tegn i Base64 alfabetet.

Dekodningsproces

Base64 dekodning reverserer kodningsprocessen:

  1. Konverter hvert Base64-tegn til dets 6-bit værdi
  2. Sammenkæd disse 6-bit værdier
  3. Gruppér bits i 8-bit klumper (bytes)
  4. Konverter hver byte til det tilsvarende tegn

Polstring

Når antallet af bytes, der skal kodes, ikke er deleligt med 3, anvendes polstring:

  • Hvis der er én byte tilbage, konverteres den til to Base64-tegn efterfulgt af "=="
  • Hvis der er to bytes tilbage, konverteres de til tre Base64-tegn efterfulgt af "="

Eksempel

Lad os kode teksten "Hello" til Base64:

  1. ASCII-repræsentation af "Hello": 72 101 108 108 111
  2. Binær repræsentation: 01001000 01100101 01101100 01101100 01101111
  3. Gruppér i 6-bit klumper: 010010 000110 010101 101100 011011 000110 1111
  4. Den sidste klump har kun 4 bits, så vi polstrer med nuller: 010010 000110 010101 101100 011011 000110 111100
  5. Konvertering til decimal: 18, 6, 21, 44, 27, 6, 60
  6. Opslag i Base64 alfabetet: S, G, V, s, b, G, 8
  7. Resultatet er "SGVsbG8="

Bemærk polstringen "=" i slutningen, fordi inputlængden (5 bytes) ikke er delelig med 3.

Formel

Den generelle formel til beregning af længden af en Base64 kodet streng er:

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

Hvor x\lceil x \rceil repræsenterer loftfunktionen (afrunding op til nærmeste heltal).

Anvendelsesområder

Base64 kodning bruges bredt i forskellige applikationer:

  1. E-mail Vedhæftninger: MIME (Multipurpose Internet Mail Extensions) bruger Base64 til at kode binære vedhæftninger i e-mail.

  2. Data URLs: Indlejring af små billeder, skrifttyper eller andre ressourcer direkte i HTML, CSS eller JavaScript ved hjælp af data: URL-scheme.

  3. API Kommunikation: Sikkert overføre binære data i JSON-payloads eller andre tekstbaserede API-formater.

  4. Lagring af Binære Data i Tekstformater: Når binære data skal gemmes i XML, JSON eller andre tekstbaserede formater.

  5. Autentificeringssystemer: Basic Authentication i HTTP bruger Base64 kodning (selvom det ikke er til sikkerhed, kun til kodning).

  6. Kryptografi: Som en del af forskellige kryptografiske protokoller og systemer, ofte til kodning af nøgler eller certifikater.

  7. Cookie Værdier: Kodning af komplekse datastrukturer til at blive gemt i cookies.

Alternativer

Selvom Base64 er meget anvendt, er der alternativer, der måske er mere passende i visse situationer:

  1. URL-sikker Base64: En variant, der bruger "-" og "_" i stedet for "+" og "/" for at undgå URL-kodningsproblemer. Nyttig til data, der skal inkluderes i URLs.

  2. Base32: Bruger et 32-tegns sæt, hvilket resulterer i længere output, men med bedre menneskelig læsbarhed og case-insensitivitet.

  3. Hex Kodning: Enkel konvertering til hexadecimal, som er mindre effektiv (fordobler størrelsen), men meget simpel og bredt understøttet.

  4. Binær Overførsel: For store filer eller når effektivitet er afgørende, er direkte binær overførselsprotokoller som HTTP med passende Content-Type headers at foretrække.

  5. Kompression + Base64: For store tekstdata kan komprimering før kodning mindske størrelsesforøgelsen.

  6. JSON/XML Serialisering: For strukturerede data kan brugen af ​​native JSON eller XML serialisering være mere passende end Base64 kodning.

Historie

Base64 kodning har sine rødder i tidlig computing og telekommunikationssystemer, hvor binære data skulle overføres over kanaler designet til tekst.

Den formelle specifikation af Base64 blev først offentliggjort i 1987 som en del af RFC 989, der definerede Privacy Enhanced Mail (PEM). Dette blev senere opdateret i RFC 1421 (1993) og RFC 2045 (1996, som en del af MIME).

Begrebet "Base64" stammer fra det faktum, at kodningen bruger 64 forskellige ASCII-tegn til at repræsentere binære data. Dette valg af 64 tegn var bevidst, da 64 er en potens af 2 (2^6), hvilket gør konverteringen mellem binær og Base64 effektiv.

Over tid er der opstået flere varianter af Base64:

  • Standard Base64: Som defineret i RFC 4648, der bruger A-Z, a-z, 0-9, +, / og = til polstring
  • URL-sikker Base64: Bruger - og _ i stedet for + og / for at undgå URL-kodningsproblemer
  • Filnavn-sikker Base64: Ligner URL-sikker, designet til brug i filnavne
  • Modificeret Base64 til IMAP: Bruges i IMAP-protokollen med et andet sæt specialtegn

På trods af at være over tre årtier gammel, forbliver Base64 et grundlæggende værktøj i moderne computing, især med stigningen af webapplikationer og API'er, der i høj grad er afhængige af tekstbaserede dataformater som JSON.

Kodeeksempler

Her er eksempler på Base64 kodning og dekodning i forskellige programmeringssprog:

// JavaScript Base64 Kodning/Dekodning
function encodeToBase64(text) {
  return btoa(text);
}

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

// Eksempel på brug
const originalText = "Hello, World!";
const encoded = encodeToBase64(originalText);
console.log("Kodet:", encoded);  // SGVsbG8sIFdvcmxkIQ==

try {
  const decoded = decodeFromBase64(encoded);
  console.log("Dekodet:", decoded);  // Hello, World!
} catch (error) {
  console.error(error.message);
}
# Python Base64 Kodning/Dekodning
import base64

def encode_to_base64(text):
    # Konverter string til bytes og derefter kode
    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:
        # Konverter base64 streng til bytes og derefter dekode
        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"Ugyldig Base64 streng: {e}")

# Eksempel på brug
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
print(f"Kodet: {encoded}")  # SGVsbG8sIFdvcmxkIQ==

try:
    decoded = decode_from_base64(encoded)
    print(f"Dekodet: {decoded}")  # Hello, World!
except ValueError as e:
    print(e)
// Java Base64 Kodning/Dekodning
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("Ugyldig Base64 streng: " + e.getMessage());
        }
    }
    
    public static void main(String[] args) {
        String originalText = "Hello, World!";
        String encoded = encodeToBase64(originalText);
        System.out.println("Kodet: " + encoded);  // SGVsbG8sIFdvcmxkIQ==
        
        try {
            String decoded = decodeFromBase64(encoded);
            System.out.println("Dekodet: " + decoded);  // Hello, World!
        } catch (IllegalArgumentException e) {
            System.err.println(e.getMessage());
        }
    }
}
<?php
// PHP Base64 Kodning/Dekodning
function encodeToBase64($text) {
    return base64_encode($text);
}

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

// Eksempel på brug
$originalText = "Hello, World!";
$encoded = encodeToBase64($originalText);
echo "Kodet: " . $encoded . "\n";  // SGVsbG8sIFdvcmxkIQ==

try {
    $decoded = decodeFromBase64($encoded);
    echo "Dekodet: " . $decoded . "\n";  // Hello, World!
} catch (Exception $e) {
    echo "Fejl: " . $e->getMessage() . "\n";
}
?>
// C# Base64 Kodning/Dekodning
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("Ugyldig Base64 streng");
        }
    }
    
    static void Main()
    {
        string originalText = "Hello, World!";
        string encoded = EncodeToBase64(originalText);
        Console.WriteLine($"Kodet: {encoded}");  // SGVsbG8sIFdvcmxkIQ==
        
        try
        {
            string decoded = DecodeFromBase64(encoded);
            Console.WriteLine($"Dekodet: {decoded}");  // Hello, World!
        }
        catch (FormatException e)
        {
            Console.WriteLine($"Fejl: {e.Message}");
        }
    }
}
# Ruby Base64 Kodning/Dekodning
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 "Ugyldig Base64 streng: #{e.message}"
  end
end

# Eksempel på brug
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
puts "Kodet: #{encoded}"  # SGVsbG8sIFdvcmxkIQ==

begin
  decoded = decode_from_base64(encoded)
  puts "Dekodet: #{decoded}"  # Hello, World!
rescue StandardError => e
  puts "Fejl: #{e.message}"
end
// Go Base64 Kodning/Dekodning
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("ugyldig Base64 streng: %v", err)
    }
    return string(bytes), nil
}

func main() {
    originalText := "Hello, World!"
    encoded := encodeToBase64(originalText)
    fmt.Println("Kodet:", encoded)  // SGVsbG8sIFdvcmxkIQ==
    
    decoded, err := decodeFromBase64(encoded)
    if err != nil {
        fmt.Println("Fejl:", err)
    } else {
        fmt.Println("Dekodet:", decoded)  // Hello, World!
    }
}
// Swift Base64 Kodning/Dekodning
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
}

// Eksempel på brug
let originalText = "Hello, World!"
if let encoded = encodeToBase64(originalText) {
    print("Kodet: \(encoded)")  // SGVsbG8sIFdvcmxkIQ==
    
    if let decoded = decodeFromBase64(encoded) {
        print("Dekodet: \(decoded)")  // Hello, World!
    } else {
        print("Fejl: Kunne ikke dekode Base64 streng")
    }
} else {
    print("Fejl: Kunne ikke kode tekst")
}
' Excel VBA Base64 Kodning/Dekodning
' Bemærk: Dette kræver en reference til 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 = "Fejl: Ugyldig Base64 streng"
End Function

' Brug i et regneark:
' =EncodeToBase64("Hello, World!")
' =DecodeFromBase64("SGVsbG8sIFdvcmxkIQ==")
# R Base64 Kodning/Dekodning
# Kræver pakken 'base64enc'
# install.packages("base64enc")
library(base64enc)

encode_to_base64 <- function(text) {
  # Konverter tekst til rå bytes, og derefter kode
  text_raw <- charToRaw(text)
  base64_encoded <- base64encode(text_raw)
  return(rawToChar(base64_encoded))
}

decode_from_base64 <- function(base64_string) {
  tryCatch({
    # Konverter base64 streng til rå, og derefter dekode
    base64_raw <- charToRaw(base64_string)
    decoded_raw <- base64decode(base64_raw)
    return(rawToChar(decoded_raw))
  }, error = function(e) {
    stop(paste("Ugyldig Base64 streng:", e$message))
  })
}

# Eksempel på brug
original_text <- "Hello, World!"
encoded <- encode_to_base64(original_text)
cat("Kodet:", encoded, "\n")  # SGVsbG8sIFdvcmxkIQ==

tryCatch({
  decoded <- decode_from_base64(encoded)
  cat("Dekodet:", decoded, "\n")  # Hello, World!
}, error = function(e) {
  cat("Fejl:", e$message, "\n")
})
% MATLAB Base64 Kodning/Dekodning
function demo_base64()
    originalText = 'Hello, World!';
    
    % Kodning
    encoded = encode_to_base64(originalText);
    fprintf('Kodet: %s\n', encoded);  % SGVsbG8sIFdvcmxkIQ==
    
    % Dekodning
    try
        decoded = decode_from_base64(encoded);
        fprintf('Dekodet: %s\n', decoded);  % Hello, World!
    catch e
        fprintf('Fejl: %s\n', e.message);
    end
end

function encoded = encode_to_base64(text)
    % Konverter tekst til uint8 array og kode
    bytes = uint8(text);
    encoded = base64encode(bytes);
end

function decoded = decode_from_base64(base64String)
    try
        % Dekode base64 streng til uint8 array
        bytes = base64decode(base64String);
        decoded = char(bytes);
    catch
        error('Ugyldig Base64 streng');
    end
end
// C Base64 Kodning/Dekodning ved hjælp af 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; // Ugyldig Base64 input
    }
    
    buffer[decoded_length] = '\0';
    
    BIO_free_all(bio);
    
    return buffer;
}

int main() {
    const char* original_text = "Hello, World!";
    
    char* encoded = encode_to_base64(original_text);
    printf("Kodet: %s\n", encoded);  // SGVsbG8sIFdvcmxkIQ==
    
    char* decoded = decode_from_base64(encoded);
    if (decoded) {
        printf("Dekodet: %s\n", decoded);  // Hello, World!
        free(decoded);
    } else {
        printf("Fejl: Ugyldig Base64 streng\n");
    }
    
    free(encoded);
    
    return 0;
}
// Rust Base64 Kodning/Dekodning
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!("Ugyldig UTF-8 sekvens: {}", e))
            }
        },
        Err(e) => Err(format!("Ugyldig Base64 streng: {}", e))
    }
}

fn main() {
    let original_text = "Hello, World!";
    let encoded = encode_to_base64(original_text);
    println!("Kodet: {}", encoded);  // SGVsbG8sIFdvcmxkIQ==
    
    match decode_from_base64(&encoded) {
        Ok(decoded) => println!("Dekodet: {}", decoded),  // Hello, World!
        Err(e) => println!("Fejl: {}", e)
    }
}

Kantsager og Overvejelser

Når du arbejder med Base64 kodning og dekodning, skal du være opmærksom på disse vigtige overvejelser:

  1. Unicode og Non-ASCII Tegn: Når du koder tekst med non-ASCII tegn, skal du sikre korrekt tegnkodning (normalt UTF-8) før Base64 kodning.

  2. Polstring: Standard Base64 bruger polstring med "=" tegn for at sikre, at outputlængden er et multiplum af 4. Nogle implementeringer tillader at undlade polstring, hvilket kan forårsage kompatibilitetsproblemer.

  3. Linjeskift: Traditionelle Base64 implementeringer indsætter linjeskift (typisk hver 76 tegn) for læsbarhed, men moderne applikationer udelader ofte disse.

  4. URL-Sikker Base64: Standard Base64 bruger "+" og "/" tegn, som har specielle betydninger i URLs. Til URL-kontekster skal du bruge URL-sikker Base64, der erstatter disse med "-" og "_".

  5. Whitespace: Ved dekodning er nogle implementeringer lempelige og ignorerer whitespace, mens andre kræver præcist input.

  6. Størrelsesforøgelse: Base64 kodning øger størrelsen af data med cirka 33% (4 output bytes for hver 3 input bytes).

  7. Ydelse: Base64 kodning/dekodning kan være beregningsmæssigt intensiv for meget store data. Overvej streamingtilgange for store filer.

Referencer

  1. RFC 4648 - Base16, Base32, og Base64 Data Kodninger
  2. RFC 2045 - MIME Del 1: Format af Internetbeskeder
  3. MDN Web Docs: Base64 kodning og dekodning
  4. Base64 - Wikipedia
  5. MIME - Wikipedia
Feedback