Whiz Tools

Base64 Kodirnik/Decodirnik

Pretvori besedilo v in iz Base64 kodiranja

Kopiraj

Base64 Kodirnik in Dekodirnik

Uvod

Base64 je shema kodiranja binarnega v besedilo, ki predstavlja binarne podatke v formatu ASCII niza. Namenjena je prenosu podatkov, shranjenih v binarnih formatih, prek kanalov, ki zanesljivo podpirajo le besedilno vsebino. Kodiranje Base64 pretvarja binarne podatke v niz 64 znakov (od tod tudi ime), ki jih je mogoče varno prenašati prek protokolov, temelječih na besedilu, brez poškodbe podatkov.

Nabor znakov Base64 sestavljajo:

  • Velike črke A-Z (26 znakov)
  • Male črke a-z (26 znakov)
  • Številke 0-9 (10 znakov)
  • Dva dodatna znaka, običajno "+" in "/" (2 znaka)

To orodje vam omogoča enostavno kodiranje besedila v format Base64 ali dekodiranje Base64 nizov nazaj v njihov izvirni tekst. Zelo je uporabno za razvijalce, IT strokovnjake in vse, ki delajo s podatki, ki jih je treba varno prenašati prek besedilnih kanalov.

Kako deluje kodiranje Base64

Proces kodiranja

Kodiranje Base64 deluje tako, da vsako skupino treh bajtov (24 bitov) binarnih podatkov pretvori v štiri znake Base64. Postopek sledi tem korakom:

  1. Pretvorite vhodno besedilo v njegovo binarno predstavitev (z uporabo kodiranja ASCII ali UTF-8)
  2. Skupite binarne podatke v kose po 24 bitov (3 bajti)
  3. Razdelite vsak kos 24 bitov na štiri skupine po 6 bitov
  4. Pretvorite vsako skupino po 6 bitov v njen ustrezen znak Base64

Ko dolžina vnosa ni deljiva s 3, se doda polnilo z "=" znaki, da se ohrani razmerje 4:3 dolžin izhoda in vnosa.

Matematična predstavitev

Za zaporedje bajtov b1,b2,b3b_1, b_2, b_3 se ustrezni znaki Base64 c1,c2,c3,c4c_1, c_2, c_3, c_4 izračunajo kot:

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

Kjer Base64[i]\text{Base64}[i] predstavlja ii-ti znak v abecedi Base64.

Proces dekodiranja

Dekodiranje Base64 obrne proces kodiranja:

  1. Pretvorite vsak znak Base64 v njegovo vrednost po 6 bitov
  2. Združite te vrednosti po 6 bitov
  3. Skupite bite v kose po 8 bitov (bajti)
  4. Pretvorite vsak bajt v njegov ustrezen znak

Polnjenje

Ko je število bajtov, ki jih je treba kodirati, deljivo s 3, se uporabi polnjenje:

  • Če ostane en bajt, se pretvori v dva znaka Base64, ki ju spremljata "=="
  • Če ostaneta dva bajta, se pretvorita v tri znake Base64, ki jih spremlja "="

Primer

Poglejmo, kako kodirati besedilo "Hello" v Base64:

  1. ASCII predstavitev "Hello": 72 101 108 108 111
  2. Binarna predstavitev: 01001000 01100101 01101100 01101100 01101111
  3. Skupina v 6-bitne kose: 010010 000110 010101 101100 011011 000110 1111
  4. Zadnji kos ima le 4 bite, zato polnimo z ničlami: 010010 000110 010101 101100 011011 000110 111100
  5. Pretvorba v decimalno: 18, 6, 21, 44, 27, 6, 60
  6. Iskanje v abecedi Base64: S, G, V, s, b, G, 8
  7. Rezultat je "SGVsbG8="

Opazite polnilo "=" na koncu, ker dolžina vnosa (5 bajtov) ni deljiva s 3.

Formula

Splošna formula za izračun dolžine Base64 kodirane niza je:

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

Kjer x\lceil x \rceil predstavlja funkcijo celega števila (zaokroževanje navzgor na najbližje celo število).

Uporabe

Kodiranje Base64 se široko uporablja v različnih aplikacijah:

  1. Priloge v e-pošti: MIME (Multipurpose Internet Mail Extensions) uporablja Base64 za kodiranje binarnih prilog v e-pošti.

  2. Podatkovne URL: Vdelava majhnih slik, pisav ali drugih virov neposredno v HTML, CSS ali JavaScript z uporabo sheme URL data:.

  3. Komunikacije API: Varno prenašanje binarnih podatkov v JSON paketih ali drugih besedilnih API formatih.

  4. Shranjevanje binarnih podatkov v besedilnih formatih: Ko je treba binarne podatke shraniti v XML, JSON ali druge besedilne formate.

  5. Sistemi za overjanje: Osnovna overitev v HTTP uporablja kodiranje Base64 (čeprav to ni za varnost, temveč za kodiranje).

  6. Kriptografija: Kot del različnih kriptografskih protokolov in sistemov, pogosto za kodiranje ključev ali certifikatov.

  7. Vrednosti piškotkov: Kodiranje kompleksnih podatkovnih struktur, ki jih je treba shraniti v piškotkih.

Alternativen

Čeprav je Base64 široko uporabljen, obstajajo alternativni načini, ki so morda bolj primerni v določenih situacijah:

  1. URL-varna Base64: Različica, ki uporablja "-" in "_" namesto "+" in "/" za izogibanje težavam z kodiranjem URL. Uporabno za podatke, ki bodo vključeni v URL.

  2. Base32: Uporablja 32-znakovni nabor, kar vodi do daljšega izhoda, vendar z boljšo berljivostjo za ljudi in brez občutljivosti na velike in male črke.

  3. Hex kodiranje: Preprosta pretvorba v šestnajstiško, ki je manj učinkovita (podvoji velikost), vendar zelo preprosta in široko podprta.

  4. Binarni prenos: Za velike datoteke ali ko je učinkovitost ključna, so neposredni protokoli za prenos binarnih podatkov, kot je HTTP z ustreznimi glavi vsebine, bolj primerni.

  5. Stiskanje + Base64: Za velike besedilne podatke lahko stiskanje pred kodiranjem zmanjša povečanje velikosti.

  6. JSON/XML serijalizacija: Za strukturirane podatke je morda bolj primerno uporabiti naravno serijalizacijo JSON ali XML namesto kodiranja Base64.

Zgodovina

Kodiranje Base64 ima svoje korenine v zgodnjem računalništvu in telekomunikacijskih sistemih, kjer je bilo treba binarne podatke prenašati prek kanalov, zasnovanih za besedilo.

Formalna specifikacija Base64 je bila prvič objavljena leta 1987 kot del RFC 989, ki je opredelil zasebno izboljšano pošto (PEM). To je bilo kasneje posodobljeno v RFC 1421 (1993) in RFC 2045 (1996, kot del MIME).

Izraz "Base64" izhaja iz dejstva, da kodiranje uporablja 64 različnih ASCII znakov za predstavitev binarnih podatkov. Ta izbira 64 znakov je bila namerna, saj je 64 moč 2 (2^6), kar omogoča učinkovito pretvorbo med binarnimi in Base64 podatki.

Sčasoma so se pojavile različne različice Base64:

  • Standardna Base64: Kot je opredeljeno v RFC 4648, uporablja A-Z, a-z, 0-9, +, / in = za polnjenje
  • URL-varna Base64: Uporablja - in _ namesto + in / za izogibanje težavam z kodiranjem URL
  • Varna Base64 za imena datotek: Podobno kot URL-varna, zasnovana za uporabo v imenih datotek
  • Spremenjena Base64 za IMAP: Uporablja se v protokolu IMAP z drugačnim naborom posebnih znakov

Kljub temu, da je stara več kot tri desetletja, Base64 ostaja temeljno orodje v sodobnem računalništvu, zlasti z naraščanjem spletnih aplikacij in API-jev, ki se močno zanašajo na besedilne podatkovne formate, kot je JSON.

Kode Primeri

Tukaj so primeri kodiranja in dekodiranja Base64 v različnih programskih jezikih:

// JavaScript Base64 Kodiranje/Dekodiranje
function encodeToBase64(text) {
  return btoa(text);
}

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

// Primer uporabe
const originalText = "Hello, World!";
const encoded = encodeToBase64(originalText);
console.log("Kodirano:", encoded);  // SGVsbG8sIFdvcmxkIQ==

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

def encode_to_base64(text):
    # Pretvorba niza v bajte in nato kodiranje
    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:
        # Pretvorba base64 niza v bajte in nato dekodiranje
        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"Neveljavna Base64 niz: {e}")

# Primer uporabe
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
print(f"Kodirano: {encoded}")  # SGVsbG8sIFdvcmxkIQ==

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

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

// Primer uporabe
$originalText = "Hello, World!";
$encoded = encodeToBase64($originalText);
echo "Kodirano: " . $encoded . "\n";  // SGVsbG8sIFdvcmxkIQ==

try {
    $decoded = decodeFromBase64($encoded);
    echo "Dekodirano: " . $decoded . "\n";  // Hello, World!
} catch (Exception $e) {
    echo "Napaka: " . $e->getMessage() . "\n";
}
?>
// C# Base64 Kodiranje/Dekodiranje
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("Neveljavna Base64 niz");
        }
    }
    
    static void Main()
    {
        string originalText = "Hello, World!";
        string encoded = EncodeToBase64(originalText);
        Console.WriteLine($"Kodirano: {encoded}");  // SGVsbG8sIFdvcmxkIQ==
        
        try
        {
            string decoded = DecodeFromBase64(encoded);
            Console.WriteLine($"Dekodirano: {decoded}");  // Hello, World!
        }
        catch (FormatException e)
        {
            Console.WriteLine($"Napaka: {e.Message}");
        }
    }
}
# Ruby Base64 Kodiranje/Dekodiranje
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 "Neveljavna Base64 niz: #{e.message}"
  end
end

# Primer uporabe
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
puts "Kodirano: #{encoded}"  # SGVsbG8sIFdvcmxkIQ==

begin
  decoded = decode_from_base64(encoded)
  puts "Dekodirano: #{decoded}"  # Hello, World!
rescue StandardError => e
  puts "Napaka: #{e.message}"
end
// Go Base64 Kodiranje/Dekodiranje
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("neveljavna Base64 niz: %v", err)
    }
    return string(bytes), nil
}

func main() {
    originalText := "Hello, World!"
    encoded := encodeToBase64(originalText)
    fmt.Println("Kodirano:", encoded)  // SGVsbG8sIFdvcmxkIQ==
    
    decoded, err := decodeFromBase64(encoded)
    if err != nil {
        fmt.Println("Napaka:", err)
    } else {
        fmt.Println("Dekodirano:", decoded)  // Hello, World!
    }
}
// Swift Base64 Kodiranje/Dekodiranje
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
}

// Primer uporabe
let originalText = "Hello, World!"
if let encoded = encodeToBase64(originalText) {
    print("Kodirano: \(encoded)")  // SGVsbG8sIFdvcmxkIQ==
    
    if let decoded = decodeFromBase64(encoded) {
        print("Dekodirano: \(decoded)")  // Hello, World!
    } else {
        print("Napaka: Ne morem dekodirati Base64 niza")
    }
} else {
    print("Napaka: Ne morem kodirati besedila")
}
' Excel VBA Base64 Kodiranje/Dekodiranje
' Opomba: To zahteva referenco 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 = "Napaka: Neveljavna Base64 niz"
End Function

' Uporaba v delovnem listu:
' =EncodeToBase64("Hello, World!")
' =DecodeFromBase64("SGVsbG8sIFdvcmxkIQ==")
# R Base64 Kodiranje/Dekodiranje
# Zahteva paket 'base64enc'
# install.packages("base64enc")
library(base64enc)

encode_to_base64 <- function(text) {
  # Pretvorba besedila v surove bajte, nato kodiranje
  text_raw <- charToRaw(text)
  base64_encoded <- base64encode(text_raw)
  return(rawToChar(base64_encoded))
}

decode_from_base64 <- function(base64_string) {
  tryCatch({
    # Pretvorba base64 niza v surove, nato dekodiranje
    base64_raw <- charToRaw(base64_string)
    decoded_raw <- base64decode(base64_raw)
    return(rawToChar(decoded_raw))
  }, error = function(e) {
    stop(paste("Neveljavna Base64 niz:", e$message))
  })
}

# Primer uporabe
original_text <- "Hello, World!"
encoded <- encode_to_base64(original_text)
cat("Kodirano:", encoded, "\n")  # SGVsbG8sIFdvcmxkIQ==

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

function encoded = encode_to_base64(text)
    % Pretvorba besedila v uint8 tabelo in kodiranje
    bytes = uint8(text);
    encoded = base64encode(bytes);
end

function decoded = decode_from_base64(base64String)
    try
        % Dekodiranje base64 niza v uint8 tabelo
        bytes = base64decode(base64String);
        decoded = char(bytes);
    catch
        error('Neveljavna Base64 niz');
    end
end
// C Base64 Kodiranje/Dekodiranje z uporabo 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; // Neveljavna Base64 vhod
    }
    
    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("Kodirano: %s\n", encoded);  // SGVsbG8sIFdvcmxkIQ==
    
    char* decoded = decode_from_base64(encoded);
    if (decoded) {
        printf("Dekodirano: %s\n", decoded);  // Hello, World!
        free(decoded);
    } else {
        printf("Napaka: Neveljavna Base64 niz\n");
    }
    
    free(encoded);
    
    return 0;
}
// Rust Base64 Kodiranje/Dekodiranje
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!("Neveljavna UTF-8 sekvenca: {}", e))
            }
        },
        Err(e) => Err(format!("Neveljavna Base64 niz: {}", e))
    }
}

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

Robne primere in razmisleki

Ko delate z Base64 kodiranjem in dekodiranjem, bodite pozorni na te pomembne razmisleke:

  1. Unicode in ne-ASCII znaki: Pri kodiranju besedila z ne-ASCII znaki se prepričajte, da pred Base64 kodiranjem uporabite pravilno kodiranje znakov (običajno UTF-8).

  2. Polnjenje: Standardna Base64 uporablja polnjenje z "=" znaki, da zagotovi, da je dolžina izhoda večkratnik 4. Nekatere implementacije omogočajo opustitev polnjenja, kar lahko povzroči težave s kompatibilnostjo.

  3. Prelomi vrstic: Tradicionalne implementacije Base64 vstavljajo prelome vrstic (običajno vsakih 76 znakov) za berljivost, vendar sodobne aplikacije pogosto te opustijo.

  4. URL-varna Base64: Standardna Base64 uporablja "+" in "/" znake, ki imajo posebne pomene v URL-jih. Za kontekste URL uporabite URL-varno Base64, ki te zamenja z "-" in "_".

  5. Bela mesta: Pri dekodiranju nekatere implementacije dopuščajo in ignorirajo bela mesta, medtem ko druge zahtevajo natančen vhod.

  6. Povečanje velikosti: Kodiranje Base64 povečuje velikost podatkov za približno 33% (4 izhodni bajti za vsak 3 vhodne bajte).

  7. Učinkovitost: Kodiranje/dekodiranje Base64 je lahko računsko intenzivno za zelo velike podatke. Razmislite o pristopih za pretakanje za velike datoteke.

Reference

  1. RFC 4648 - Base16, Base32 in Base64 podatkovne kodiranja
  2. RFC 2045 - MIME Prvi del: Oblika internetnih sporočil
  3. MDN Web Docs: Base64 kodiranje in dekodiranje
  4. Base64 - Wikipedia
  5. MIME - Wikipedia
Feedback