Whiz Tools

Base64 Kódovač/Decodér

Převeďte text na a z Base64 kódování

Kopírovat

Encoder a dekodér Base64

Úvod

Base64 je kódovací schéma pro převod binárních dat na text, které reprezentuje binární data v ASCII formátu. Je navrženo tak, aby přenášelo data uložená v binárních formátech přes kanály, které spolehlivě podporují pouze textový obsah. Kódování Base64 převádí binární data na sadu 64 znaků (odtud název), které mohou být bezpečně přenášeny přes textové protokoly bez poškození dat.

Sada znaků Base64 se skládá z:

  • Velkých písmen A-Z (26 znaků)
  • Malých písmen a-z (26 znaků)
  • Čísel 0-9 (10 znaků)
  • Dva další znaky, obvykle "+" a "/" (2 znaky)

Tento nástroj vám umožňuje snadno kódovat text do formátu Base64 nebo dekódovat Base64 řetězce zpět do jejich původního textu. Je obzvlášť užitečný pro vývojáře, IT profesionály a každého, kdo pracuje s daty, která je třeba bezpečně přenášet přes textové kanály.

Jak funguje kódování Base64

Proces kódování

Kódování Base64 funguje tak, že převádí každou skupinu tří bytů (24 bitů) binárních dat na čtyři znaky Base64. Proces probíhá podle těchto kroků:

  1. Převeďte vstupní text na jeho binární reprezentaci (používající ASCII nebo UTF-8 kódování)
  2. Skupinujte binární data do bloků po 24 bitech (3 byty)
  3. Rozdělte každý 24-bitový blok na čtyři 6-bitové skupiny
  4. Převeďte každou 6-bitovou skupinu na odpovídající Base64 znak

Pokud délka vstupu není dělitelná třemi, přidává se padding s "=" znaky, aby se udržel poměr 4:3 mezi délkou výstupu a vstupu.

Matematická reprezentace

Pro sekvenci bytů b1,b2,b3b_1, b_2, b_3 jsou odpovídající Base64 znaky c1,c2,c3,c4c_1, c_2, c_3, c_4 vypočítány jako:

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

Kde Base64[i]\text{Base64}[i] představuje ii-tý znak v abecedě Base64.

Proces dekódování

Dekódování Base64 obrací proces kódování:

  1. Převeďte každý Base64 znak na jeho 6-bitovou hodnotu
  2. Spojte tyto 6-bitové hodnoty
  3. Skupinujte bity do 8-bitových bloků (bytů)
  4. Převeďte každý byt na odpovídající znak

Padding

Když je počet bytů kódování dělitelný třemi, aplikuje se padding:

  • Pokud zbývá jeden byt, převede se na dva Base64 znaky následované "=="
  • Pokud zbývají dva byty, převedou se na tři Base64 znaky následované "="

Příklad

Pojďme kódovat text "Hello" do Base64:

  1. ASCII reprezentace "Hello": 72 101 108 108 111
  2. Binární reprezentace: 01001000 01100101 01101100 01101100 01101111
  3. Skupinování do 6-bitových bloků: 010010 000110 010101 101100 011011 000110 1111
  4. Poslední blok má pouze 4 bity, takže přidáme nuly: 010010 000110 010101 101100 011011 000110 111100
  5. Převedení na desetinné číslo: 18, 6, 21, 44, 27, 6, 60
  6. Hledání v abecedě Base64: S, G, V, s, b, G, 8
  7. Výsledek je "SGVsbG8="

Všimněte si paddingu "=" na konci, protože délka vstupu (5 bytů) není dělitelná třemi.

Vzorec

Obecný vzorec pro výpočet délky Base64 kódovaného řetězce je:

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

Kde x\lceil x \rceil představuje funkci zaokrouhlení nahoru (zaokrouhlení na nejbližší celé číslo).

Případy použití

Kódování Base64 se široce používá v různých aplikacích:

  1. E-mailové přílohy: MIME (Multipurpose Internet Mail Extensions) používá Base64 kódování pro kódování binárních příloh v e-mailech.

  2. Data URL: Vkládání malých obrázků, písem nebo jiných zdrojů přímo do HTML, CSS nebo JavaScriptu pomocí schématu URL data:.

  3. API komunikace: Bezpečné přenášení binárních dat v JSON datech nebo jiných textových API formátech.

  4. Ukládání binárních dat v textových formátech: Když je třeba binární data uložit v XML, JSON nebo jiných textových formátech.

  5. Systémy ověřování: Základní ověřování v HTTP používá kódování Base64 (i když to není pro bezpečnost, pouze pro kódování).

  6. Kryptografie: Jako součást různých kryptografických protokolů a systémů, často pro kódování klíčů nebo certifikátů.

  7. Hodnoty cookies: Kódování složitých datových struktur pro ukládání do cookies.

Alternativy

I když je Base64 široce používáno, existují alternativy, které mohou být vhodnější v určitých situacích:

  1. URL-safe Base64: Varianta, která používá "-" a "_" místo "+" a "/" aby se předešlo problémům s kódováním URL. Užitečné pro data, která budou zahrnuta v URL.

  2. Base32: Používá 32 znaků, což vede k delšímu výstupu, ale s lepší čitelností pro lidi a bez závislosti na velikosti písmen.

  3. Hex kódování: Jednoduchá konverze na hexadecimální, která je méně efektivní (zdvojnásobuje velikost), ale velmi jednoduchá a široce podporovaná.

  4. Binární přenos: Pro velké soubory nebo když je efektivita klíčová, jsou preferovány přímé binární přenosové protokoly jako HTTP s odpovídajícími hlavičkami Content-Type.

  5. Kompresní + Base64: Pro velká textová data může komprese před kódováním zmírnit nárůst velikosti.

  6. JSON/XML serializace: Pro strukturovaná data může být použití nativní JSON nebo XML serializace vhodnější než kódování Base64.

Historie

Kódování Base64 má své kořeny v raném počítačovém a telekomunikačním systému, kde bylo třeba přenášet binární data přes kanály navržené pro text.

Formální specifikace Base64 byla poprvé zveřejněna v roce 1987 jako součást RFC 989, která definovala Privacy Enhanced Mail (PEM). To bylo později aktualizováno v RFC 1421 (1993) a RFC 2045 (1996, jako součást MIME).

Termín "Base64" pochází z toho, že kódování používá 64 různých ASCII znaků k reprezentaci binárních dat. Tento výběr 64 znaků byl záměrný, protože 64 je mocnina 2 (2^6), což činí převod mezi binárními a Base64 efektivním.

V průběhu času se objevily různé varianty Base64:

  • Standardní Base64: Jak je definováno v RFC 4648, používající A-Z, a-z, 0-9, +, / a = pro padding
  • URL-safe Base64: Používá - a _ místo + a / aby se předešlo problémům s kódováním URL
  • Bezpečná Base64 pro názvy souborů: Podobná URL-safe, navržená pro použití v názvech souborů
  • Modifikovaná Base64 pro IMAP: Používá se v protokolu IMAP s jinou sadou speciálních znaků

Navzdory tomu, že je Base64 více než tři desetiletí staré, zůstává základním nástrojem v moderním počítačovém prostředí, zejména s nárůstem webových aplikací a API, které se silně spoléhají na textové datové formáty jako JSON.

Příklady kódu

Zde jsou příklady kódování a dekódování Base64 v různých programovacích jazycích:

// JavaScript Base64 Kódování/Dekódování
function encodeToBase64(text) {
  return btoa(text);
}

function decodeFromBase64(base64String) {
  try {
    return atob(base64String);
  } catch (e) {
    throw new Error("Neplatný Base64 řetězec");
  }
}

// Příklad použití
const originalText = "Hello, World!";
const encoded = encodeToBase64(originalText);
console.log("Kódováno:", encoded);  // SGVsbG8sIFdvcmxkIQ==

try {
  const decoded = decodeFromBase64(encoded);
  console.log("Dekódováno:", decoded);  // Hello, World!
} catch (error) {
  console.error(error.message);
}
# Python Base64 Kódování/Dekódování
import base64

def encode_to_base64(text):
    # Převeďte řetězec na byty a pak kódujte
    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:
        # Převeďte base64 řetězec na byty a pak dekódujte
        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"Neplatný Base64 řetězec: {e}")

# Příklad použití
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
print(f"Kódováno: {encoded}")  # SGVsbG8sIFdvcmxkIQ==

try:
    decoded = decode_from_base64(encoded)
    print(f"Dekódováno: {decoded}")  # Hello, World!
except ValueError as e:
    print(e)
// Java Base64 Kódování/Dekódování
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("Neplatný Base64 řetězec: " + e.getMessage());
        }
    }
    
    public static void main(String[] args) {
        String originalText = "Hello, World!";
        String encoded = encodeToBase64(originalText);
        System.out.println("Kódováno: " + encoded);  // SGVsbG8sIFdvcmxkIQ==
        
        try {
            String decoded = decodeFromBase64(encoded);
            System.out.println("Dekódováno: " + decoded);  // Hello, World!
        } catch (IllegalArgumentException e) {
            System.err.println(e.getMessage());
        }
    }
}
<?php
// PHP Base64 Kódování/Dekódování
function encodeToBase64($text) {
    return base64_encode($text);
}

function decodeFromBase64($base64String) {
    $decoded = base64_decode($base64String, true);
    if ($decoded === false) {
        throw new Exception("Neplatný Base64 řetězec");
    }
    return $decoded;
}

// Příklad použití
$originalText = "Hello, World!";
$encoded = encodeToBase64($originalText);
echo "Kódováno: " . $encoded . "\n";  // SGVsbG8sIFdvcmxkIQ==

try {
    $decoded = decodeFromBase64($encoded);
    echo "Dekódováno: " . $decoded . "\n";  // Hello, World!
} catch (Exception $e) {
    echo "Chyba: " . $e->getMessage() . "\n";
}
?>
// C# Base64 Kódování/Dekódování
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("Neplatný Base64 řetězec");
        }
    }
    
    static void Main()
    {
        string originalText = "Hello, World!";
        string encoded = EncodeToBase64(originalText);
        Console.WriteLine($"Kódováno: {encoded}");  // SGVsbG8sIFdvcmxkIQ==
        
        try
        {
            string decoded = DecodeFromBase64(encoded);
            Console.WriteLine($"Dekódováno: {decoded}");  // Hello, World!
        }
        catch (FormatException e)
        {
            Console.WriteLine($"Chyba: {e.Message}");
        }
    }
}
# Ruby Base64 Kódování/Dekódování
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 "Neplatný Base64 řetězec: #{e.message}"
  end
end

# Příklad použití
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
puts "Kódováno: #{encoded}"  # SGVsbG8sIFdvcmxkIQ==

begin
  decoded = decode_from_base64(encoded)
  puts "Dekódováno: #{decoded}"  # Hello, World!
rescue StandardError => e
  puts "Chyba: #{e.message}"
end
// Go Base64 Kódování/Dekódování
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("neplatný Base64 řetězec: %v", err)
    }
    return string(bytes), nil
}

func main() {
    originalText := "Hello, World!"
    encoded := encodeToBase64(originalText)
    fmt.Println("Kódováno:", encoded)  // SGVsbG8sIFdvcmxkIQ==
    
    decoded, err := decodeFromBase64(encoded)
    if err != nil {
        fmt.Println("Chyba:", err)
    } else {
        fmt.Println("Dekódováno:", decoded)  // Hello, World!
    }
}
// Swift Base64 Kódování/Dekódování
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
}

// Příklad použití
let originalText = "Hello, World!"
if let encoded = encodeToBase64(originalText) {
    print("Kódováno: \(encoded)")  // SGVsbG8sIFdvcmxkIQ==
    
    if let decoded = decodeFromBase64(encoded) {
        print("Dekódováno: \(decoded)")  // Hello, World!
    } else {
        print("Chyba: Nelze dekódovat Base64 řetězec")
    }
} else {
    print("Chyba: Nelze kódovat text")
}
' Excel VBA Base64 Kódování/Dekódování
' Poznámka: To vyžaduje odkaz na 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 = "Chyba: Neplatný Base64 řetězec"
End Function

' Použití v pracovním listu:
' =EncodeToBase64("Hello, World!")
' =DecodeFromBase64("SGVsbG8sIFdvcmxkIQ==")
# R Base64 Kódování/Dekódování
# Vyžaduje balíček 'base64enc'
# install.packages("base64enc")
library(base64enc)

encode_to_base64 <- function(text) {
  # Převeďte text na surové byty, pak kódujte
  text_raw <- charToRaw(text)
  base64_encoded <- base64encode(text_raw)
  return(rawToChar(base64_encoded))
}

decode_from_base64 <- function(base64_string) {
  tryCatch({
    # Převeďte base64 řetězec na surové, pak dekódujte
    base64_raw <- charToRaw(base64_string)
    decoded_raw <- base64decode(base64_raw)
    return(rawToChar(decoded_raw))
  }, error = function(e) {
    stop(paste("Neplatný Base64 řetězec:", e$message))
  })
}

# Příklad použití
original_text <- "Hello, World!"
encoded <- encode_to_base64(original_text)
cat("Kódováno:", encoded, "\n")  # SGVsbG8sIFdvcmxkIQ==

tryCatch({
  decoded <- decode_from_base64(encoded)
  cat("Dekódováno:", decoded, "\n")  # Hello, World!
}, error = function(e) {
  cat("Chyba:", e$message, "\n")
})
% MATLAB Base64 Kódování/Dekódování
function demo_base64()
    originalText = 'Hello, World!';
    
    % Kódování
    encoded = encode_to_base64(originalText);
    fprintf('Kódováno: %s\n', encoded);  % SGVsbG8sIFdvcmxkIQ==
    
    % Dekódování
    try
        decoded = decode_from_base64(encoded);
        fprintf('Dekódováno: %s\n', decoded);  % Hello, World!
    catch e
        fprintf('Chyba: %s\n', e.message);
    end
end

function encoded = encode_to_base64(text)
    % Převeďte text na uint8 pole a kódujte
    bytes = uint8(text);
    encoded = base64encode(bytes);
end

function decoded = decode_from_base64(base64String)
    try
        % Dekódujte base64 řetězec na uint8 pole
        bytes = base64decode(base64String);
        decoded = char(bytes);
    catch
        error('Neplatný Base64 řetězec');
    end
end
// C Base64 Kódování/Dekódování pomocí 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; // Neplatný Base64 vstup
    }
    
    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("Kódováno: %s\n", encoded);  // SGVsbG8sIFdvcmxkIQ==
    
    char* decoded = decode_from_base64(encoded);
    if (decoded) {
        printf("Dekódováno: %s\n", decoded);  // Hello, World!
        free(decoded);
    } else {
        printf("Chyba: Neplatný Base64 řetězec\n");
    }
    
    free(encoded);
    
    return 0;
}
// Rust Base64 Kódování/Dekódování
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!("Neplatná UTF-8 sekvence: {}", e))
            }
        },
        Err(e) => Err(format!("Neplatný Base64 řetězec: {}", e))
    }
}

fn main() {
    let original_text = "Hello, World!";
    let encoded = encode_to_base64(original_text);
    println!("Kódováno: {}", encoded);  // SGVsbG8sIFdvcmxkIQ==
    
    match decode_from_base64(&encoded) {
        Ok(decoded) => println!("Dekódováno: {}", decoded),  // Hello, World!
        Err(e) => println!("Chyba: {}", e)
    }
}

Okrajové případy a úvahy

Při práci s kódováním a dekódováním Base64 mějte na paměti tyto důležité úvahy:

  1. Unicode a znaky mimo ASCII: Při kódování textu s ne-ASCII znaky se ujistěte o správném kódování znaků (obvykle UTF-8) před kódováním Base64.

  2. Padding: Standardní Base64 používá padding s "=" znaky, aby se zajistilo, že délka výstupu je násobkem 4. Některé implementace umožňují vynechat padding, což může způsobit problémy s kompatibilitou.

  3. Zalamování řádků: Tradiční implementace Base64 vkládají zalamování řádků (obvykle každých 76 znaků) pro čitelnost, ale moderní aplikace často tyto vynechávají.

  4. URL-Safe Base64: Standardní Base64 používá "+" a "/" znaky, které mají v URL speciální významy. Pro kontexty URL použijte URL-safe Base64, která tyto znaky nahrazuje "-" a "_".

  5. Bílý prostor: Při dekódování některé implementace jsou shovívavé a ignorují bílý prostor, zatímco jiné vyžadují přesný vstup.

  6. Nárůst velikosti: Kódování Base64 zvyšuje velikost dat přibližně o 33% (4 výstupní byty na každé 3 vstupní byty).

  7. Výkon: Kódování/dekódování Base64 může být výpočetně náročné pro velmi velká data. Zvažte přístup ke streamování pro velké soubory.

Odkazy

  1. RFC 4648 - Kódování dat Base16, Base32 a Base64
  2. RFC 2045 - MIME část první: Formát internetových zpráv
  3. MDN Web Docs: Kódování a dekódování Base64
  4. Base64 - Wikipedia
  5. MIME - Wikipedia
Feedback