Whiz Tools

Base64 Kodirač/ Dekoder

Pretvorite tekst u Base64 kodiranje i obrnuto

Kopiraj

Base64 Encoder i Decoder

Uvod

Base64 je shema kodiranja binarnih podataka u tekst koja predstavlja binarne podatke u ASCII string formatu. Dizajnirana je za prenošenje podataka pohranjenih u binarnim formatima preko kanala koji pouzdano podržavaju samo tekstualni sadržaj. Base64 kodiranje pretvara binarne podatke u skup od 64 znaka (otuda i naziv) koji se mogu sigurno prenositi putem protokola temeljenih na tekstu bez oštećenja podataka.

Skup znakova Base64 sastoji se od:

  • Velikih slova A-Z (26 znakova)
  • Malih slova a-z (26 znakova)
  • Brojeva 0-9 (10 znakova)
  • Dva dodatna znaka, obično "+" i "/" (2 znaka)

Ovaj alat vam omogućuje da lako kodirate tekst u Base64 format ili dekodirate Base64 stringove natrag u njihov izvorni tekst. Osobito je koristan za programere, IT profesionalce i sve koji rade s podacima koji se trebaju sigurno prenositi preko kanala temeljenih na tekstu.

Kako Base64 Kodiranje Funkcionira

Proces Kodiranja

Base64 kodiranje radi tako da svaki skup od tri bajta (24 bita) binarnih podataka pretvara u četiri Base64 znaka. Proces slijedi ove korake:

  1. Pretvorite ulazni tekst u njegovu binarnu reprezentaciju (koristeći ASCII ili UTF-8 kodiranje)
  2. Grupirajte binarne podatke u komade od 24 bita (3 bajta)
  3. Podijelite svaki 24-bitni komad u četiri 6-bitne grupe
  4. Pretvorite svaku 6-bitnu grupu u njen odgovarajući Base64 znak

Kada duljina ulaza nije djeljiva s 3, dodaje se padding s "=" znakovima kako bi se održala omjer 4:3 između duljina izlaza i ulaza.

Matematička Reprezentacija

Za niz bajtova b1,b2,b3b_1, b_2, b_3, odgovarajući Base64 znakovi c1,c2,c3,c4c_1, c_2, c_3, c_4 izračunavaju se kao:

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

Gdje Base64[i]\text{Base64}[i] predstavlja ii-ti znak u Base64 abecedi.

Proces Dekodiranja

Base64 dekodiranje obrće proces kodiranja:

  1. Pretvorite svaki Base64 znak u njegovu 6-bitnu vrijednost
  2. Spojite ove 6-bitne vrijednosti
  3. Grupirajte bitove u 8-bitne komade (bajte)
  4. Pretvorite svaki bajt u njegov odgovarajući znak

Padding

Kada broj bajtova koji se kodiraju nije djeljiv s 3, primjenjuje se padding:

  • Ako ostane jedan bajt, pretvara se u dva Base64 znaka praćena "=="
  • Ako ostanu dva bajta, oni se pretvaraju u tri Base64 znaka praćena "="

Primjer

Kodirajmo tekst "Hello" u Base64:

  1. ASCII reprezentacija "Hello": 72 101 108 108 111
  2. Binarna reprezentacija: 01001000 01100101 01101100 01101100 01101111
  3. Grupiranje u 6-bitne komade: 010010 000110 010101 101100 011011 000110 1111
  4. Posljednji komad ima samo 4 bita, pa dodajemo nule: 010010 000110 010101 101100 011011 000110 111100
  5. Pretvaranje u decimalu: 18, 6, 21, 44, 27, 6, 60
  6. Pretraživanje u Base64 abecedi: S, G, V, s, b, G, 8
  7. Rezultat je "SGVsbG8="

Primijetite "=" padding na kraju jer duljina ulaza (5 bajtova) nije djeljiva s 3.

Formula

Opća formula za izračunavanje duljine Base64 kodiranog stringa je:

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

Gdje x\lceil x \rceil predstavlja funkciju zaokruživanja (zaokruživanje na najbliži cijeli broj prema gore).

Upotrebe

Base64 kodiranje se široko koristi u raznim aplikacijama:

  1. Email Prilozi: MIME (Multipurpose Internet Mail Extensions) koristi Base64 za kodiranje binarnih priloga u emailovima.

  2. Data URL-ovi: Uključivanje malih slika, fontova ili drugih resursa direktno u HTML, CSS ili JavaScript koristeći data: URL shemu.

  3. API Komunikacije: Sigurno prenošenje binarnih podataka u JSON payload-ima ili drugim formatima API-ja temeljenim na tekstu.

  4. Pohrana Binarnih Podataka u Tekstualnim Formatima: Kada se binarni podaci trebaju pohraniti u XML, JSON ili druge tekstualne formate.

  5. Sustavi Autentifikacije: Osnovna autentifikacija u HTTP-u koristi Base64 kodiranje (iako nije za sigurnost, već za kodiranje).

  6. Kriptografija: Kao dio raznih kriptografskih protokola i sustava, često za kodiranje ključeva ili certifikata.

  7. Vrijednosti Kolačića: Kodiranje složenih struktura podataka za pohranu u kolačićima.

Alternativne Opcije

Iako je Base64 široko korišten, postoje alternativne opcije koje bi mogle biti prikladnije u određenim situacijama:

  1. URL-sigurno Base64: Varijanta koja koristi "-" i "_" umjesto "+" i "/" kako bi izbjegla probleme s URL kodiranjem. Korisno za podatke koji će biti uključeni u URL-ove.

  2. Base32: Koristi skup od 32 znaka, što rezultira dužim izlazom, ali s boljom čitljivošću za ljude i bez obzira na velika/mala slova.

  3. Hex Kodiranje: Jednostavna konverzija u heksadecimalni oblik, koja je manje učinkovita (udvostručuje veličinu) ali vrlo jednostavna i široko podržana.

  4. Binarni Prijenos: Za velike datoteke ili kada je učinkovitost ključna, izravni binarni prijenosni protokoli poput HTTP-a s odgovarajućim Content-Type zaglavljima su poželjniji.

  5. Kompresija + Base64: Za velike tekstualne podatke, kompresija prije kodiranja može umanjiti povećanje veličine.

  6. JSON/XML Serijalizacija: Za strukturirane podatke, korištenje izvorne JSON ili XML serijalizacije može biti prikladnije od Base64 kodiranja.

Povijest

Base64 kodiranje ima svoje korijene u ranom računalstvu i telekomunikacijskim sustavima gdje su se binarni podaci trebali prenositi preko kanala dizajniranih za tekst.

Formalna specifikacija Base64 prvi put je objavljena 1987. godine kao dio RFC 989, koji je definirao Privatno poboljšano poštansko (PEM). Ovo je kasnije ažurirano u RFC 1421 (1993) i RFC 2045 (1996, kao dio MIME).

Termin "Base64" dolazi od činjenice da kodiranje koristi 64 različita ASCII znaka za predstavljanje binarnih podataka. Ovaj izbor od 64 znaka bio je namjeran, jer je 64 potencija 2 (2^6), što čini konverziju između binarnog i Base64 učinkovitom.

S vremenom su se pojavile nekoliko varijanti Base64:

  • Standardni Base64: Kako je definirano u RFC 4648, koristeći A-Z, a-z, 0-9, +, / i = za padding
  • URL-sigurno Base64: Koristi - i _ umjesto + i / kako bi se izbjegli problemi s URL kodiranjem
  • Sigurno za nazive datoteka Base64: Slično URL-sigurnom, dizajnirano za korištenje u nazivima datoteka
  • Modificirani Base64 za IMAP: Koristi se u IMAP protokolu s različitim skupom posebnih znakova

Unatoč tome što je staro više od tri desetljeća, Base64 ostaje temeljni alat u modernom računalstvu, posebno s porastom web aplikacija i API-ja koji se snažno oslanjaju na formate podataka temeljen na tekstu kao što je JSON.

Primjeri Koda

Evo primjera Base64 kodiranja i dekodiranja u raznim programskim jezicima:

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

function decodeFromBase64(base64String) {
  try {
    return atob(base64String);
  } catch (e) {
    throw new Error("Nevažeći Base64 string");
  }
}

// Primjer korištenja
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):
    # Pretvori string u bajtove i zatim kodiraj
    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:
        # Pretvori base64 string u bajtove i zatim dekodiraj
        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"Nevažeći Base64 string: {e}")

# Primjer korištenja
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("Nevažeći Base64 string: " + 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("Nevažeći Base64 string");
    }
    return $decoded;
}

// Primjer korištenja
$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 "Greška: " . $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("Nevažeći Base64 string");
        }
    }
    
    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($"Greška: {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 "Nevažeći Base64 string: #{e.message}"
  end
end

# Primjer korištenja
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 "Greška: #{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("nevažeći Base64 string: %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("Greška:", 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
}

// Primjer korištenja
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("Greška: Ne može se dekodirati Base64 string")
    }
} else {
    print("Greška: Ne može se kodirati tekst")
}
' Excel VBA Base64 Kodiranje/Dekodiranje
' Napomena: Ovo zahtijeva referencu 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 = "Greška: Nevažeći Base64 string"
End Function

' Korištenje u radnom listu:
' =EncodeToBase64("Hello, World!")
' =DecodeFromBase64("SGVsbG8sIFdvcmxkIQ==")
# R Base64 Kodiranje/Dekodiranje
# Zahtijeva paket 'base64enc'
# install.packages("base64enc")
library(base64enc)

encode_to_base64 <- function(text) {
  # Pretvori tekst u sirove bajtove, zatim kodiraj
  text_raw <- charToRaw(text)
  base64_encoded <- base64encode(text_raw)
  return(rawToChar(base64_encoded))
}

decode_from_base64 <- function(base64_string) {
  tryCatch({
    # Pretvori base64 string u sirove bajtove, zatim dekodiraj
    base64_raw <- charToRaw(base64_string)
    decoded_raw <- base64decode(base64_raw)
    return(rawToChar(decoded_raw))
  }, error = function(e) {
    stop(paste("Nevažeći Base64 string:", e$message))
  })
}

# Primjer korištenja
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("Greška:", e$message, "\n")
})
% MATLAB Base64 Kodiranje/Dekodiranje
function demo_base64()
    originalText = 'Hello, World!';
    
    % Kodiraj
    encoded = encode_to_base64(originalText);
    fprintf('Kodirano: %s\n', encoded);  % SGVsbG8sIFdvcmxkIQ==
    
    % Dekodiraj
    try
        decoded = decode_from_base64(encoded);
        fprintf('Dekodirano: %s\n', decoded);  % Hello, World!
    catch e
        fprintf('Greška: %s\n', e.message);
    end
end

function encoded = encode_to_base64(text)
    % Pretvori tekst u uint8 niz i kodiraj
    bytes = uint8(text);
    encoded = base64encode(bytes);
end

function decoded = decode_from_base64(base64String)
    try
        % Dekodiraj base64 string u uint8 niz
        bytes = base64decode(base64String);
        decoded = char(bytes);
    catch
        error('Nevažeći Base64 string');
    end
end
// C Base64 Kodiranje/Dekodiranje koristeći 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; // Nevažeći Base64 ulaz
    }
    
    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("Greška: Nevažeći Base64 string\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!("Nevažeća UTF-8 sekvenca: {}", e))
            }
        },
        Err(e) => Err(format!("Nevažeći Base64 string: {}", 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!("Greška: {}", e)
    }
}

Rubne Slučajeve i Razmatranja

Kada radite s Base64 kodiranjem i dekodiranjem, budite svjesni ovih važnih razmatranja:

  1. Unicode i Ne-ASCII Znakovi: Kada kodirate tekst s ne-ASCII znakovima, osigurajte pravilno kodiranje znakova (obično UTF-8) prije Base64 kodiranja.

  2. Padding: Standardni Base64 koristi padding s "=" znakovima kako bi osigurao da duljina izlaza bude višekratnik 4. Neki implementacije dopuštaju izostavljanje paddinga, što može uzrokovati probleme s kompatibilnošću.

  3. Prelomi Redova: Tradicionalne Base64 implementacije umetnu prelome redova (obično svakih 76 znakova) radi čitljivosti, ali moderne aplikacije često izostavljaju ove.

  4. URL-sigurno Base64: Standardni Base64 koristi "+" i "/" znakove koji imaju posebna značenja u URL-ovima. Za kontekste URL-a, koristite URL-sigurno Base64 koje zamjenjuje ove s "-" i "_".

  5. Bijeg: Pri dekodiranju, neke implementacije su tolerantne i ignoriraju bijeg, dok druge zahtijevaju točan ulaz.

  6. Povećanje Veličine: Base64 kodiranje povećava veličinu podataka za otprilike 33% (4 izlazna bajta za svaki 3 ulazna bajta).

  7. Učinkovitost: Base64 kodiranje/dekodiranje može biti računalno intenzivno za vrlo velike podatke. Razmislite o pristupima strujanja za velike datoteke.

Reference

  1. RFC 4648 - Base16, Base32 i Base64 Kodiranja Podataka
  2. RFC 2045 - MIME Prvi Dio: Format Internet Poruka
  3. MDN Web Docs: Base64 kodiranje i dekodiranje
  4. Base64 - Wikipedia
  5. MIME - Wikipedia
Feedback