Whiz Tools

Base64 Koder/Dekoder

Konverter tekst til og fra Base64-koding

Kopier

Base64-koderen og -dekoderen

Introduksjon

Base64 er en binær-til-tekst kodingsordning som representerer binærdata i et ASCII-strengformat. Den er designet for å bære data lagret i binære formater over kanaler som bare pålitelig støtter tekstinnhold. Base64-koding konverterer binærdata til et sett med 64 tegn (derav navnet) som trygt kan overføres over tekstbaserte protokoller uten datakorruptjon.

Base64-tegnsettet består av:

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

Dette verktøyet lar deg enkelt kode tekst til Base64-format eller dekode Base64-strenger tilbake til deres opprinnelige tekst. Det er spesielt nyttig for utviklere, IT-profesjonelle, og alle som arbeider med data som må overføres trygt over tekstbaserte kanaler.

Hvordan Base64-koding fungerer

Kodingprosess

Base64-koding fungerer ved å konvertere hver gruppe av tre byte (24 biter) med binærdata til fire Base64-tegn. Prosessen følger disse trinnene:

  1. Konverter den innkommende teksten til dens binære representasjon (ved hjelp av ASCII eller UTF-8-koding)
  2. Gruppere binærdataene i biter av 24 biter (3 byte)
  3. Splitte hver 24-bits chunk i fire 6-bits grupper
  4. Konvertere hver 6-bits gruppe til sitt tilsvarende Base64-tegn

Når inngangslengden ikke er delelig med 3, legges det til padding med "=" tegn for å opprettholde 4:3-forholdet mellom utgang og inngangslengder.

Matematisk representasjon

For en sekvens av bytes b1,b2,b3b_1, b_2, b_3, beregnes de tilsvarende Base64-tegnene 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] representerer det ii-te tegnet i Base64-alphabetet.

Dekodingsprosess

Base64-dekoding reverserer kodingprosessen:

  1. Konverter hvert Base64-tegn til sin 6-bits verdi
  2. Koble disse 6-bits verdiene sammen
  3. Gruppere bitene i 8-bits chunks (bytes)
  4. Konvertere hver byte til sitt tilsvarende tegn

Padding

Når antallet bytes som skal kodes ikke er delelig med 3, brukes padding:

  • Hvis det er én byte igjen, konverteres den til to Base64-tegn etterfulgt av "=="
  • Hvis det er to bytes igjen, konverteres de til tre Base64-tegn etterfulgt av "="

Eksempel

La oss kode teksten "Hello" til Base64:

  1. ASCII-representasjon av "Hello": 72 101 108 108 111
  2. Binær representasjon: 01001000 01100101 01101100 01101100 01101111
  3. Gruppere i 6-bits chunks: 010010 000110 010101 101100 011011 000110 1111
  4. Den siste chunk har bare 4 biter, så vi legger til nuller: 010010 000110 010101 101100 011011 000110 111100
  5. Konvertering til desimal: 18, 6, 21, 44, 27, 6, 60
  6. Ser opp i Base64-alphabetet: S, G, V, s, b, G, 8
  7. Resultatet er "SGVsbG8="

Merk padding med "=" på slutten fordi inngangslengden (5 bytes) ikke er delelig med 3.

Formel

Den generelle formelen for å beregne lengden på 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 representerer tak-funksjonen (runder opp til nærmeste heltall).

Bruksområder

Base64-koding er mye brukt i ulike applikasjoner:

  1. E-postvedlegg: MIME (Multipurpose Internet Mail Extensions) bruker Base64 for å kode binære vedlegg i e-post.

  2. Data-URL-er: Innkapsling av små bilder, skrifttyper eller andre ressurser direkte i HTML, CSS eller JavaScript ved hjelp av data: URL-skjemaet.

  3. API-kommunikasjon: Trygt overføre binærdata i JSON-payloads eller andre tekstbaserte API-formater.

  4. Lagring av binærdata i tekstformater: Når binærdata må lagres i XML, JSON eller andre tekstbaserte formater.

  5. Autentiseringssystemer: Basic Authentication i HTTP bruker Base64-koding (selv om det ikke er for sikkerhet, bare for koding).

  6. Kryptografi: Som en del av ulike kryptografiske protokoller og systemer, ofte for koding av nøkler eller sertifikater.

  7. Cookie-verdier: Koding av komplekse datastrukturer for å lagres i informasjonskapsler.

Alternativer

Selv om Base64 er mye brukt, finnes det alternativer som kan være mer passende i visse situasjoner:

  1. URL-sikker Base64: En variant som bruker "-" og "_" i stedet for "+" og "/" for å unngå URL-kodingsproblemer. Nyttig for data som skal inkluderes i URL-er.

  2. Base32: Bruker et 32-tegns sett, noe som resulterer i lengre utdata, men med bedre lesbarhet for mennesker og case-insensitivitet.

  3. Hex-koding: Enkel konvertering til heksadesimal, som er mindre effektiv (dobler størrelsen) men veldig enkel og mye støttet.

  4. Binæroverføring: For store filer eller når effektivitet er avgjørende, er direkte binæroverføringsprotokoller som HTTP med passende Content-Type-headere å foretrekke.

  5. Kompresjon + Base64: For store tekstdata kan komprimering før koding redusere størrelsesøkningen.

  6. JSON/XML-serialisering: For strukturerte data kan det være mer passende å bruke innfødt JSON- eller XML-serialisering enn Base64-koding.

Historie

Base64-koding har sine røtter i tidlig databehandling og telekommunikasjonssystemer der binærdata måtte overføres over kanaler designet for tekst.

Den formelle spesifikasjonen av Base64 ble først publisert i 1987 som en del av RFC 989, som definerte Privacy Enhanced Mail (PEM). Dette ble senere oppdatert i RFC 1421 (1993) og RFC 2045 (1996, som en del av MIME).

Begrepet "Base64" kommer fra det faktum at kodingen bruker 64 forskjellige ASCII-tegn for å representere binærdata. Dette valget av 64 tegn var bevisst, ettersom 64 er en makt av 2 (2^6), noe som gjør konverteringen mellom binær og Base64 effektiv.

Over tid har flere varianter av Base64 dukket opp:

  • Standard Base64: Som definert i RFC 4648, bruker A-Z, a-z, 0-9, +, / og = for padding
  • URL-sikker Base64: Bruker - og _ i stedet for + og / for å unngå URL-kodingsproblemer
  • Filnavn-sikker Base64: Ligner på URL-sikker, designet for bruk i filnavn
  • Modifisert Base64 for IMAP: Brukt i IMAP-protokollen med et annet sett med spesialtegn

Til tross for å være over tre tiår gammel, forblir Base64 et grunnleggende verktøy i moderne databehandling, spesielt med fremveksten av webapplikasjoner og API-er som i stor grad er avhengige av tekstbaserte dataformater som JSON.

Kodeeksempler

Her er eksempler på Base64-koding og dekoding i ulike programmeringsspråk:

// JavaScript Base64-koding/dekoding
function encodeToBase64(text) {
  return btoa(text);
}

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

// Eksempel på bruk
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-koding/dekoding
import base64

def encode_to_base64(text):
    # Konvertere streng til bytes og deretter 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:
        # Konvertere base64-streng til bytes og deretter 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å bruk
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-koding/dekoding
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-koding/dekoding
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å bruk
$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 "Feil: " . $e->getMessage() . "\n";
}
?>
// C# Base64-koding/dekoding
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($"Feil: {e.Message}");
        }
    }
}
# Ruby Base64-koding/dekoding
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å bruk
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 "Feil: #{e.message}"
end
// Go Base64-koding/dekoding
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("Feil:", err)
    } else {
        fmt.Println("Dekodet:", decoded)  // Hello, World!
    }
}
// Swift Base64-koding/dekoding
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å bruk
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("Feil: Kunne ikke dekode Base64-streng")
    }
} else {
    print("Feil: Kunne ikke kode tekst")
}
' Excel VBA Base64-koding/dekoding
' Merk: Dette krever en referanse 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 = "Feil: Ugyldig Base64-streng"
End Function

' Bruk i et regneark:
' =EncodeToBase64("Hello, World!")
' =DecodeFromBase64("SGVsbG8sIFdvcmxkIQ==")
# R Base64-koding/dekoding
# Krever 'base64enc'-pakken
# install.packages("base64enc")
library(base64enc)

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

decode_from_base64 <- function(base64_string) {
  tryCatch({
    # Konvertere base64-streng til rå, deretter 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å bruk
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("Feil:", e$message, "\n")
})
% MATLAB Base64-koding/dekoding
function demo_base64()
    originalText = 'Hello, World!';
    
    % Kode
    encoded = encode_to_base64(originalText);
    fprintf('Kodet: %s\n', encoded);  % SGVsbG8sIFdvcmxkIQ==
    
    % Dekode
    try
        decoded = decode_from_base64(encoded);
        fprintf('Dekodet: %s\n', decoded);  % Hello, World!
    catch e
        fprintf('Feil: %s\n', e.message);
    end
end

function encoded = encode_to_base64(text)
    % Konvertere 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-koding/dekoding ved hjelp av 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-inndata
    }
    
    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("Feil: Ugyldig Base64-streng\n");
    }
    
    free(encoded);
    
    return 0;
}
// Rust Base64-koding/dekoding
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!("Feil: {}", e)
    }
}

Kanttilfeller og hensyn

Når du arbeider med Base64-koding og dekoding, vær oppmerksom på disse viktige hensynene:

  1. Unicode og ikke-ASCII-tegn: Når du koder tekst med ikke-ASCII-tegn, sørg for riktig tegnkoding (vanligvis UTF-8) før Base64-koding.

  2. Padding: Standard Base64 bruker padding med "=" tegn for å sikre at utgangslengden er et multiplum av 4. Noen implementeringer tillater å utelate padding, noe som kan forårsake kompatibilitetsproblemer.

  3. Linjeskift: Tradisjonelle Base64-implementeringer setter inn linjeskift (vanligvis hver 76 tegn) for lesbarhet, men moderne applikasjoner utelater ofte disse.

  4. URL-sikker Base64: Standard Base64 bruker "+" og "/" tegn som har spesielle betydninger i URL-er. For URL-kontekster, bruk URL-sikker Base64 som erstatter disse med "-" og "_".

  5. Whitespace: Ved dekoding er noen implementeringer tolerante og ignorerer whitespace, mens andre krever nøyaktig inndata.

  6. Størrelsesøkning: Base64-koding øker størrelsen på data med omtrent 33% (4 utdata bytes for hver 3 inndata bytes).

  7. Ytelse: Base64-koding/dekoding kan være beregningsmessig intensivt for veldig store data. Vurder strømming tilnærminger for store filer.

Referanser

  1. RFC 4648 - Base16, Base32, og Base64 Data Encodings
  2. RFC 2045 - MIME Del 1: Format av Internett-meldingskropper
  3. MDN Web Docs: Base64-koding og dekoding
  4. Base64 - Wikipedia
  5. MIME - Wikipedia
Feedback