Whiz Tools

Encoder/Decoder Base64

Convertiți textul în și din codificarea Base64

Copiați

Encoder și Decodor Base64

Introducere

Base64 este un sistem de codificare binar-la-text care reprezintă date binare într-un format de șir ASCII. Este conceput pentru a transporta date stocate în formate binare prin canale care susțin în mod fiabil doar conținut text. Codificarea Base64 convertește datele binare într-un set de 64 de caractere (de aici și numele) care pot fi transmise în siguranță prin protocoale bazate pe text fără coruperea datelor.

Setul de caractere Base64 constă din:

  • Litere mari A-Z (26 caractere)
  • Litere mici a-z (26 caractere)
  • Cifre 0-9 (10 caractere)
  • Două caractere suplimentare, de obicei "+" și "/" (2 caractere)

Acest instrument vă permite să codificați cu ușurință text în format Base64 sau să decodificați șiruri Base64 înapoi în textul lor original. Este deosebit de util pentru dezvoltatori, profesioniști IT și oricine lucrează cu date care trebuie transmise în siguranță prin canale bazate pe text.

Cum funcționează codificarea Base64

Procesul de codificare

Codificarea Base64 funcționează prin convertirea fiecărui grup de trei octeți (24 de biți) de date binare în patru caractere Base64. Procesul urmează acești pași:

  1. Convertiți textul de intrare în reprezentarea sa binară (folosind codificarea ASCII sau UTF-8)
  2. Grupează datele binare în bucăți de 24 de biți (3 octeți)
  3. Împărțiți fiecare bucată de 24 de biți în patru grupuri de 6 biți
  4. Convertește fiecare grup de 6 biți în caracterul Base64 corespunzător

Când lungimea intrării nu este divizibilă cu 3, se adaugă umplutură cu caractere "=" pentru a menține raportul de 4:3 al lungimii de ieșire la lungimea de intrare.

Reprezentare matematică

Pentru o secvență de octeți b1,b2,b3b_1, b_2, b_3, caracterele Base64 corespunzătoare c1,c2,c3,c4c_1, c_2, c_3, c_4 sunt calculate astfel:

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

Unde Base64[i]\text{Base64}[i] reprezintă caracterul ii din alfabetul Base64.

Procesul de decodare

Decodarea Base64 inversează procesul de codificare:

  1. Convertește fiecare caracter Base64 în valoarea sa de 6 biți
  2. Concatenează aceste valori de 6 biți
  3. Grupează biții în bucăți de 8 biți (octeți)
  4. Convertește fiecare octet în caracterul său corespunzător

Umplutură

Când numărul de octeți de codificat nu este divizibil cu 3, se aplică umplutura:

  • Dacă rămâne un octet, acesta este convertit în două caractere Base64 urmate de "=="
  • Dacă rămân două octeți, aceștia sunt convertiți în trei caractere Base64 urmate de "="

Exemplu

Să codificăm textul "Hello" în Base64:

  1. Reprezentarea ASCII a "Hello": 72 101 108 108 111
  2. Reprezentarea binară: 01001000 01100101 01101100 01101100 01101111
  3. Grupare în bucăți de 6 biți: 010010 000110 010101 101100 011011 000110 1111
  4. Ultima bucată are doar 4 biți, așa că umplem cu zerouri: 010010 000110 010101 101100 011011 000110 111100
  5. Conversia în zecimal: 18, 6, 21, 44, 27, 6, 60
  6. Căutarea în alfabetul Base64: S, G, V, s, b, G, 8
  7. Rezultatul este "SGVsbG8="

Observați umplutura "=" de la sfârșit, deoarece lungimea intrării (5 octeți) nu este divizibilă cu 3.

Formula

Formula generală pentru calcularea lungimii unui șir codificat Base64 este:

lungimea_codificata˘=4×lungimea_intra˘rii3\text{lungimea\_codificată} = 4 \times \lceil \frac{\text{lungimea\_intrării}}{3} \rceil

Unde x\lceil x \rceil reprezintă funcția de tavan (rotunjirea în sus la cel mai apropiat întreg).

Cazuri de utilizare

Codificarea Base64 este utilizată pe scară largă în diverse aplicații:

  1. Atașamente email: MIME (Extensii de poștă electronică multifuncționale) folosește Base64 pentru a codifica atașamentele binare în email.

  2. URL-uri de date: Încorporarea imaginilor mici, fonturilor sau altor resurse direct în HTML, CSS sau JavaScript folosind schema URL data:.

  3. Comunicarea API: Transmiterea în siguranță a datelor binare în payload-uri JSON sau alte formate API bazate pe text.

  4. Stocarea datelor binare în formate text: Când datele binare trebuie stocate în XML, JSON sau alte formate bazate pe text.

  5. Sisteme de autentificare: Autentificarea de bază în HTTP folosește codificarea Base64 (deși nu este pentru securitate, ci doar pentru codificare).

  6. Criptografie: Ca parte a diferitelor protocoale și sisteme criptografice, adesea pentru codificarea cheilor sau certificatelor.

  7. Valori cookie: Codificarea structurilor de date complexe pentru a fi stocate în cookie-uri.

Alternative

Deși Base64 este utilizat pe scară largă, există alternative care ar putea fi mai potrivite în anumite situații:

  1. Base64 sigur pentru URL: O variantă care folosește "-" și "_" în loc de "+" și "/" pentru a evita problemele de codificare URL. Utilă pentru datele care vor fi incluse în URL-uri.

  2. Base32: Folosește un set de 32 de caractere, rezultând o ieșire mai lungă, dar cu o citire mai bună pentru oameni și insensibilitate la caz.

  3. Codificare hexazecimală: Conversie simplă în hexazecimal, care este mai puțin eficientă (dublează dimensiunea) dar foarte simplă și larg acceptată.

  4. Transfer binar: Pentru fișiere mari sau când eficiența este crucială, protocoalele de transfer binar direct, cum ar fi HTTP cu antete de tip de conținut adecvate, sunt preferabile.

  5. Compresie + Base64: Pentru date text mari, comprimarea înainte de codificare poate diminua creșterea dimensiunii.

  6. Serializare JSON/XML: Pentru date structurate, utilizarea serializării native JSON sau XML ar putea fi mai potrivită decât codificarea Base64.

Istorie

Codificarea Base64 își are rădăcinile în sistemele timpurii de calcul și telecomunicații în care datele binare trebuiau transmise prin canale concepute pentru text.

Specificația formală a Base64 a fost publicată pentru prima dată în 1987 ca parte a RFC 989, care a definit Poșta electronică îmbunătățită prin confidențialitate (PEM). Aceasta a fost ulterior actualizată în RFC 1421 (1993) și RFC 2045 (1996, ca parte a MIME).

Termenul "Base64" provine din faptul că codificarea folosește 64 de caractere ASCII diferite pentru a reprezenta datele binare. Această alegere a 64 de caractere a fost deliberată, deoarece 64 este o putere a lui 2 (2^6), ceea ce face conversia între binar și Base64 eficientă.

De-a lungul timpului, au apărut mai multe variante ale Base64:

  • Base64 standard: Așa cum este definit în RFC 4648, folosind A-Z, a-z, 0-9, +, / și = pentru umplutură
  • Base64 sigur pentru URL: Folosește - și _ în loc de + și / pentru a evita problemele de codificare URL
  • Base64 sigur pentru nume de fișiere: Similar cu cel sigur pentru URL, conceput pentru utilizare în nume de fișiere
  • Base64 modificat pentru IMAP: Utilizat în protocolul IMAP cu un set diferit de caractere speciale

În ciuda faptului că are peste trei decenii, Base64 rămâne un instrument fundamental în computația modernă, în special cu creșterea aplicațiilor web și API-urilor care se bazează în mare măsură pe formate de date bazate pe text, cum ar fi JSON.

Exemple de cod

Iată exemple de codificare și decodare Base64 în diferite limbaje de programare:

// Codificare/Decodare Base64 în JavaScript
function encodeToBase64(text) {
  return btoa(text);
}

function decodeFromBase64(base64String) {
  try {
    return atob(base64String);
  } catch (e) {
    throw new Error("Șir Base64 invalid");
  }
}

// Exemplu de utilizare
const originalText = "Hello, World!";
const encoded = encodeToBase64(originalText);
console.log("Codificat:", encoded);  // SGVsbG8sIFdvcmxkIQ==

try {
  const decoded = decodeFromBase64(encoded);
  console.log("Decodificat:", decoded);  // Hello, World!
} catch (error) {
  console.error(error.message);
}
# Codificare/Decodare Base64 în Python
import base64

def encode_to_base64(text):
    # Convertiți șirul în octeți și apoi codificați
    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:
        # Convertiți șirul base64 în octeți și apoi decodificați
        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"Șir Base64 invalid: {e}")

# Exemplu de utilizare
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
print(f"Codificat: {encoded}")  # SGVsbG8sIFdvcmxkIQ==

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

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

// Exemplu de utilizare
$originalText = "Hello, World!";
$encoded = encodeToBase64($originalText);
echo "Codificat: " . $encoded . "\n";  // SGVsbG8sIFdvcmxkIQ==

try {
    $decoded = decodeFromBase64($encoded);
    echo "Decodificat: " . $decoded . "\n";  // Hello, World!
} catch (Exception $e) {
    echo "Eroare: " . $e->getMessage() . "\n";
}
?>
// Codificare/Decodare Base64 în C#
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("Șir Base64 invalid");
        }
    }
    
    static void Main()
    {
        string originalText = "Hello, World!";
        string encoded = EncodeToBase64(originalText);
        Console.WriteLine($"Codificat: {encoded}");  // SGVsbG8sIFdvcmxkIQ==
        
        try
        {
            string decoded = DecodeFromBase64(encoded);
            Console.WriteLine($"Decodificat: {decoded}");  // Hello, World!
        }
        catch (FormatException e)
        {
            Console.WriteLine($"Eroare: {e.Message}");
        }
    }
}
# Codificare/Decodare Base64 în Ruby
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 "Șir Base64 invalid: #{e.message}"
  end
end

# Exemplu de utilizare
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
puts "Codificat: #{encoded}"  # SGVsbG8sIFdvcmxkIQ==

begin
  decoded = decode_from_base64(encoded)
  puts "Decodificat: #{decoded}"  # Hello, World!
rescue StandardError => e
  puts "Eroare: #{e.message}"
end
// Codificare/Decodare Base64 în Go
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("șir Base64 invalid: %v", err)
    }
    return string(bytes), nil
}

func main() {
    originalText := "Hello, World!"
    encoded := encodeToBase64(originalText)
    fmt.Println("Codificat:", encoded)  // SGVsbG8sIFdvcmxkIQ==
    
    decoded, err := decodeFromBase64(encoded)
    if err != nil {
        fmt.Println("Eroare:", err)
    } else {
        fmt.Println("Decodificat:", decoded)  // Hello, World!
    }
}
// Codificare/Decodare Base64 în Swift
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
}

// Exemplu de utilizare
let originalText = "Hello, World!"
if let encoded = encodeToBase64(originalText) {
    print("Codificat: \(encoded)")  // SGVsbG8sIFdvcmxkIQ==
    
    if let decoded = decodeFromBase64(encoded) {
        print("Decodificat: \(decoded)")  // Hello, World!
    } else {
        print("Eroare: Nu s-a putut decodifica șirul Base64")
    }
} else {
    print("Eroare: Nu s-a putut codifica textul")
}
' Codificare/Decodare Base64 în Excel VBA
' Notă: Aceasta necesită o referință la 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 = "Eroare: Șir Base64 invalid"
End Function

' Utilizare într-o foaie de lucru:
' =EncodeToBase64("Hello, World!")
' =DecodeFromBase64("SGVsbG8sIFdvcmxkIQ==")
# Codificare/Decodare Base64 în R
# Necesită pachetul 'base64enc'
# install.packages("base64enc")
library(base64enc)

encode_to_base64 <- function(text) {
  # Convertiți textul în octeți raw, apoi codificați
  text_raw <- charToRaw(text)
  base64_encoded <- base64encode(text_raw)
  return(rawToChar(base64_encoded))
}

decode_from_base64 <- function(base64_string) {
  tryCatch({
    # Convertiți șirul base64 în raw, apoi decodificați
    base64_raw <- charToRaw(base64_string)
    decoded_raw <- base64decode(base64_raw)
    return(rawToChar(decoded_raw))
  }, error = function(e) {
    stop(paste("Șir Base64 invalid:", e$message))
  })
}

# Exemplu de utilizare
original_text <- "Hello, World!"
encoded <- encode_to_base64(original_text)
cat("Codificat:", encoded, "\n")  # SGVsbG8sIFdvcmxkIQ==

tryCatch({
  decoded <- decode_from_base64(encoded)
  cat("Decodificat:", decoded, "\n")  # Hello, World!
}, error = function(e) {
  cat("Eroare:", e$message, "\n")
})
% Codificare/Decodare Base64 în MATLAB
function demo_base64()
    originalText = 'Hello, World!';
    
    % Codificare
    encoded = encode_to_base64(originalText);
    fprintf('Codificat: %s\n', encoded);  % SGVsbG8sIFdvcmxkIQ==
    
    % Decodare
    try
        decoded = decode_from_base64(encoded);
        fprintf('Decodificat: %s\n', decoded);  % Hello, World!
    catch e
        fprintf('Eroare: %s\n', e.message);
    end
end

function encoded = encode_to_base64(text)
    % Convertiți textul în matrice uint8 și codificați
    bytes = uint8(text);
    encoded = base64encode(bytes);
end

function decoded = decode_from_base64(base64String)
    try
        % Decodificați șirul base64 în matrice uint8
        bytes = base64decode(base64String);
        decoded = char(bytes);
    catch
        error('Șir Base64 invalid');
    end
end
// Codificare/Decodare Base64 în C folosind 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; // Șir Base64 invalid
    }
    
    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("Codificat: %s\n", encoded);  // SGVsbG8sIFdvcmxkIQ==
    
    char* decoded = decode_from_base64(encoded);
    if (decoded) {
        printf("Decodificat: %s\n", decoded);  // Hello, World!
        free(decoded);
    } else {
        printf("Eroare: Șir Base64 invalid\n");
    }
    
    free(encoded);
    
    return 0;
}
// Codificare/Decodare Base64 în Rust
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!("Secvență UTF-8 invalidă: {}", e))
            }
        },
        Err(e) => Err(format!("Șir Base64 invalid: {}", e))
    }
}

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

Cazuri de margine și considerații

Când lucrați cu codificarea și decodarea Base64, fiți conștienți de aceste considerații importante:

  1. Caractere Unicode și non-ASCII: Când codificați text cu caractere non-ASCII, asigurați-vă că utilizați codificarea corectă a caracterelor (de obicei UTF-8) înainte de codificarea Base64.

  2. Umplutură: Base64 standard folosește umplutură cu caractere "=" pentru a asigura că lungimea ieșirii este un multiplu de 4. Unele implementări permit omisiunea umpluturii, ceea ce poate cauza probleme de compatibilitate.

  3. Între întreruperi: Implementările tradiționale Base64 introduc întreruperi de linie (de obicei la fiecare 76 de caractere) pentru lizibilitate, dar aplicațiile moderne omit adesea aceste întreruperi.

  4. Base64 sigur pentru URL: Base64 standard folosește caracterele "+" și "/" care au semnificații speciale în URL-uri. Pentru contexte URL, utilizați Base64 sigur pentru URL care înlocuiește acestea cu "-" și "_".

  5. Spațiu alb: La decodare, unele implementări sunt indulgente și ignoră spațiile albe, în timp ce altele necesită o intrare exactă.

  6. Creșterea dimensiunii: Codificarea Base64 crește dimensiunea datelor cu aproximativ 33% (4 octeți de ieșire pentru fiecare 3 octeți de intrare).

  7. Performanță: Codificarea/decodarea Base64 poate fi intensivă din punct de vedere computațional pentru date foarte mari. Luați în considerare abordările de streaming pentru fișiere mari.

Referințe

  1. RFC 4648 - Codificările de date Base16, Base32 și Base64
  2. RFC 2045 - MIME Partea întâi: Formatul corpurilor mesajelor Internet
  3. MDN Web Docs: Codificarea și decodarea Base64
  4. Base64 - Wikipedia
  5. MIME - Wikipedia
Feedback