Whiz Tools

Кодер/Декодер на Base64

Конвертирайте текст в и от Base64 кодиране

Копирай

Base64 Кодер и Декодер

Въведение

Base64 е схема за кодиране на бинарни данни в текстов формат, която представлява бинарни данни в ASCII низов формат. Тя е проектирана да пренася данни, съхранявани в бинарни формати, през канали, които надеждно поддържат само текстово съдържание. Кодиране на Base64 преобразува бинарни данни в набор от 64 символа (оттук и името), които могат безопасно да се предават през текстово базирани протоколи без корупция на данните.

Сетът от символи на Base64 се състои от:

  • Главни букви A-Z (26 символа)
  • Малки букви a-z (26 символа)
  • Цифри 0-9 (10 символа)
  • Два допълнителни символа, обикновено "+" и "/" (2 символа)

Този инструмент ви позволява лесно да кодиране текст в Base64 формат или да декодирате Base64 низове обратно в оригиналния им текст. Той е особено полезен за разработчици, ИТ специалисти и всеки, който работи с данни, които трябва да бъдат пренесени безопасно през текстово базирани канали.

Как работи кодиране на Base64

Процес на кодиране

Кодирането на Base64 работи, като преобразува всяка група от три байта (24 бита) бинарни данни в четири Base64 символа. Процесът следва следните стъпки:

  1. Преобразува входния текст в неговото бинарно представяне (използвайки ASCII или UTF-8 кодиране)
  2. Групира бинарните данни в парчета от 24 бита (3 байта)
  3. Разделя всяко 24-битово парче на четири 6-битови групи
  4. Преобразува всяка 6-битова група в съответстващия Base64 символ

Когато дължината на входа не е делима на 3, се добавя допълнително "=" символи, за да се поддържа съотношението 4:3 на дължините на изхода и входа.

Математическо представяне

За последователност от байтове b1,b2,b3b_1, b_2, b_3, съответстващите Base64 символи c1,c2,c3,c4c_1, c_2, c_3, c_4 се изчисляват като:

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

Където Base64[i]\text{Base64}[i] представлява ii-тия символ в алфавита на Base64.

Процес на декодиране

Декодирането на Base64 обръща процеса на кодиране:

  1. Преобразува всеки Base64 символ в неговата 6-битова стойност
  2. Конкатенира тези 6-битови стойности
  3. Групира битовете в 8-битови парчета (байтове)
  4. Преобразува всеки байт в съответстващия символ

Допълване

Когато броят на байтовете за кодиране не е делим на 3, се прилага допълване:

  • Ако остане един байт, той се преобразува в два Base64 символа, последвани от "=="
  • Ако останат два байта, те се преобразуват в три Base64 символа, последвани от "="

Пример

Нека кодираме текста "Hello" в Base64:

  1. ASCII представяне на "Hello": 72 101 108 108 111
  2. Бинарно представяне: 01001000 01100101 01101100 01101100 01101111
  3. Групиране в 6-битови парчета: 010010 000110 010101 101100 011011 000110 1111
  4. Последното парче има само 4 бита, така че добавяме нули: 010010 000110 010101 101100 011011 000110 111100
  5. Преобразуване в десетично: 18, 6, 21, 44, 27, 6, 60
  6. Търсене в алфавита на Base64: S, G, V, s, b, G, 8
  7. Резултатът е "SGVsbG8="

Обърнете внимание на "=" допълнението в края, тъй като дължината на входа (5 байта) не е делима на 3.

Формула

Общата формула за изчисляване на дължината на Base64 кодиран низ е:

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

Където x\lceil x \rceil представлява функцията на тавана (закръгляне нагоре до най-близкото цяло число).

Случаи на употреба

Кодирането на Base64 се използва широко в различни приложения:

  1. Имейл приложения: MIME (Multipurpose Internet Mail Extensions) използва Base64 за кодиране на бинарни приложения в имейли.

  2. Data URLs: Вграждане на малки изображения, шрифтове или други ресурси директно в HTML, CSS или JavaScript, използвайки схемата data: URL.

  3. API комуникации: Безопасно предаване на бинарни данни в JSON полезни натоварвания или други текстово базирани формати на API.

  4. Съхраняване на бинарни данни в текстови формати: Когато бинарни данни трябва да се съхраняват в XML, JSON или други текстово базирани формати.

  5. Системи за удостоверяване: Основното удостоверяване в HTTP използва Base64 кодиране (въпреки че не е за сигурност, а просто за кодиране).

  6. Криптография: Като част от различни криптографски протоколи и системи, често за кодиране на ключове или сертификати.

  7. Стойности на бисквитки: Кодиране на сложни структури от данни, за да бъдат съхранявани в бисквитки.

Алтернативи

Въпреки че Base64 е широко използван, съществуват алтернативи, които могат да бъдат по-подходящи в определени ситуации:

  1. URL-безопасен Base64: Вариант, който използва "-" и "_" вместо "+" и "/", за да избегне проблеми с кодиране на URL. Полезно за данни, които ще бъдат включени в URL адреси.

  2. Base32: Използва 32-символен набор, което води до по-дълъг изход, но с по-добра четимост и нечувствителност към регистъра.

  3. Шестнадесетично кодиране: Проста конверсия в шестнадесетичен формат, който е по-малко ефективен (удвоява размера), но много прост и широко поддържан.

  4. Бинарен трансфер: За големи файлове или когато ефективността е от съществено значение, директните бинарни трансферни протоколи като HTTP с подходящи заглавия на съдържание са предпочитани.

  5. Компресия + Base64: За големи текстови данни компресирането преди кодиране може да намали увеличението на размера.

  6. JSON/XML сериализация: За структурирани данни, използването на родна JSON или XML сериализация може да бъде по-подходящо от кодиране на Base64.

История

Кодирането на Base64 има своите корени в ранните компютърни и телекомуникационни системи, където бинарни данни трябваше да бъдат предавани през канали, проектирани за текст.

Официалната спецификация на Base64 беше публикувана за първи път през 1987 г. като част от RFC 989, който дефинираше Приватна разширена поща (PEM). Това беше по-късно актуализирано в RFC 1421 (1993) и RFC 2045 (1996, като част от MIME).

Терминът "Base64" произлиза от факта, че кодиране използва 64 различни ASCII символа за представяне на бинарни данни. Този избор на 64 символа беше умишлен, тъй като 64 е степен на 2 (2^6), което прави преобразуването между бинарно и Base64 ефективно.

С времето, няколко варианта на Base64 се появиха:

  • Стандартен Base64: Както е определено в RFC 4648, използва A-Z, a-z, 0-9, +, / и = за допълване
  • URL-безопасен Base64: Използва - и _ вместо + и / за избягване на проблеми с кодиране на URL
  • Безопасен Base64 за имена на файлове: Подобен на URL-безопасен, проектиран за употреба в имена на файлове
  • Модифициран Base64 за IMAP: Използван в IMAP протокола с различен набор от специални символи

Въпреки че е на повече от три десетилетия, Base64 остава основен инструмент в съвременните компютри, особено с нарастващото значение на уеб приложения и API, които разчитат силно на текстово базирани формати на данни като JSON.

Примери за код

Ето примери за кодиране и декодиране на Base64 на различни програмни езици:

// JavaScript Base64 Кодиране/Декодиране
function encodeToBase64(text) {
  return btoa(text);
}

function decodeFromBase64(base64String) {
  try {
    return atob(base64String);
  } catch (e) {
    throw new Error("Невалиден Base64 низ");
  }
}

// Пример за употреба
const originalText = "Hello, World!";
const encoded = encodeToBase64(originalText);
console.log("Кодирано:", encoded);  // SGVsbG8sIFdvcmxkIQ==

try {
  const decoded = decodeFromBase64(encoded);
  console.log("Декодирано:", decoded);  // Hello, World!
} catch (error) {
  console.error(error.message);
}
# Python Base64 Кодиране/Декодиране
import base64

def encode_to_base64(text):
    # Преобразува низ в байтове и след това кодира
    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:
        # Преобразува Base64 низ в байтове и след това декодира
        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"Невалиден Base64 низ: {e}")

# Пример за употреба
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
print(f"Кодирано: {encoded}")  # SGVsbG8sIFdvcmxkIQ==

try:
    decoded = decode_from_base64(encoded)
    print(f"Декодирано: {decoded}")  # Hello, World!
except ValueError as e:
    print(e)
// Java Base64 Кодиране/Декодиране
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("Невалиден Base64 низ: " + e.getMessage());
        }
    }
    
    public static void main(String[] args) {
        String originalText = "Hello, World!";
        String encoded = encodeToBase64(originalText);
        System.out.println("Кодирано: " + encoded);  // SGVsbG8sIFdvcmxkIQ==
        
        try {
            String decoded = decodeFromBase64(encoded);
            System.out.println("Декодирано: " + decoded);  // Hello, World!
        } catch (IllegalArgumentException e) {
            System.err.println(e.getMessage());
        }
    }
}
<?php
// PHP Base64 Кодиране/Декодиране
function encodeToBase64($text) {
    return base64_encode($text);
}

function decodeFromBase64($base64String) {
    $decoded = base64_decode($base64String, true);
    if ($decoded === false) {
        throw new Exception("Невалиден Base64 низ");
    }
    return $decoded;
}

// Пример за употреба
$originalText = "Hello, World!";
$encoded = encodeToBase64($originalText);
echo "Кодирано: " . $encoded . "\n";  // SGVsbG8sIFdvcmxkIQ==

try {
    $decoded = decodeFromBase64($encoded);
    echo "Декодирано: " . $decoded . "\n";  // Hello, World!
} catch (Exception $e) {
    echo "Грешка: " . $e->getMessage() . "\n";
}
?>
// C# Base64 Кодиране/Декодиране
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("Невалиден Base64 низ");
        }
    }
    
    static void Main()
    {
        string originalText = "Hello, World!";
        string encoded = EncodeToBase64(originalText);
        Console.WriteLine($"Кодирано: {encoded}");  // SGVsbG8sIFdvcmxkIQ==
        
        try
        {
            string decoded = DecodeFromBase64(encoded);
            Console.WriteLine($"Декодирано: {decoded}");  // Hello, World!
        }
        catch (FormatException e)
        {
            Console.WriteLine($"Грешка: {e.Message}");
        }
    }
}
# Ruby Base64 Кодиране/Декодиране
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 "Невалиден Base64 низ: #{e.message}"
  end
end

# Пример за употреба
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
puts "Кодирано: #{encoded}"  # SGVsbG8sIFdvcmxkIQ==

begin
  decoded = decode_from_base64(encoded)
  puts "Декодирано: #{decoded}"  # Hello, World!
rescue StandardError => e
  puts "Грешка: #{e.message}"
end
// Go Base64 Кодиране/Декодиране
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("невалиен Base64 низ: %v", err)
    }
    return string(bytes), nil
}

func main() {
    originalText := "Hello, World!"
    encoded := encodeToBase64(originalText)
    fmt.Println("Кодирано:", encoded)  // SGVsbG8sIFdvcmxkIQ==
    
    decoded, err := decodeFromBase64(encoded)
    if err != nil {
        fmt.Println("Грешка:", err)
    } else {
        fmt.Println("Декодирано:", decoded)  // Hello, World!
    }
}
// Swift Base64 Кодиране/Декодиране
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
}

// Пример за употреба
let originalText = "Hello, World!"
if let encoded = encodeToBase64(originalText) {
    print("Кодирано: \(encoded)")  // SGVsbG8sIFdvcmxkIQ==
    
    if let decoded = decodeFromBase64(encoded) {
        print("Декодирано: \(decoded)")  // Hello, World!
    } else {
        print("Грешка: Не можа да декодира Base64 низ")
    }
} else {
    print("Грешка: Не можа да кодира текста")
}
' Excel VBA Base64 Кодиране/Декодиране
' Забележка: Това изисква референция към 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 = "Грешка: Невалиден Base64 низ"
End Function

' Употреба в работен лист:
' =EncodeToBase64("Hello, World!")
' =DecodeFromBase64("SGVsbG8sIFdvcmxkIQ==")
# R Base64 Кодиране/Декодиране
# Изисква пакета 'base64enc'
# install.packages("base64enc")
library(base64enc)

encode_to_base64 <- function(text) {
  # Преобразува текста в сурови байтове, след което кодира
  text_raw <- charToRaw(text)
  base64_encoded <- base64encode(text_raw)
  return(rawToChar(base64_encoded))
}

decode_from_base64 <- function(base64_string) {
  tryCatch({
    # Преобразува Base64 низ в сурови байтове, след което декодира
    base64_raw <- charToRaw(base64_string)
    decoded_raw <- base64decode(base64_raw)
    return(rawToChar(decoded_raw))
  }, error = function(e) {
    stop(paste("Невалиден Base64 низ:", e$message))
  })
}

# Пример за употреба
original_text <- "Hello, World!"
encoded <- encode_to_base64(original_text)
cat("Кодирано:", encoded, "\n")  # SGVsbG8sIFdvcmxkIQ==

tryCatch({
  decoded <- decode_from_base64(encoded)
  cat("Декодирано:", decoded, "\n")  # Hello, World!
}, error = function(e) {
  cat("Грешка:", e$message, "\n")
})
% MATLAB Base64 Кодиране/Декодиране
function demo_base64()
    originalText = 'Hello, World!';
    
    % Кодиране
    encoded = encode_to_base64(originalText);
    fprintf('Кодирано: %s\n', encoded);  % SGVsbG8sIFdvcmxkIQ==
    
    % Декодиране
    try
        decoded = decode_from_base64(encoded);
        fprintf('Декодирано: %s\n', decoded);  % Hello, World!
    catch e
        fprintf('Грешка: %s\n', e.message);
    end
end

function encoded = encode_to_base64(text)
    % Преобразува текста в масив от uint8 и кодира
    bytes = uint8(text);
    encoded = base64encode(bytes);
end

function decoded = decode_from_base64(base64String)
    try
        % Декодира Base64 низ в масив от uint8
        bytes = base64decode(base64String);
        decoded = char(bytes);
    catch
        error('Невалиден Base64 низ');
    end
end
// C Base64 Кодиране/Декодиране с 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; // Невалиден Base64 вход
    }
    
    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("Кодирано: %s\n", encoded);  // SGVsbG8sIFdvcmxkIQ==
    
    char* decoded = decode_from_base64(encoded);
    if (decoded) {
        printf("Декодирано: %s\n", decoded);  // Hello, World!
        free(decoded);
    } else {
        printf("Грешка: Невалиден Base64 низ\n");
    }
    
    free(encoded);
    
    return 0;
}
// Rust Base64 Кодиране/Декодиране
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!("Невалидна UTF-8 последователност: {}", e))
            }
        },
        Err(e) => Err(format!("Невалиден Base64 низ: {}", e))
    }
}

fn main() {
    let original_text = "Hello, World!";
    let encoded = encode_to_base64(original_text);
    println!("Кодирано: {}", encoded);  // SGVsbG8sIFdvcmxkIQ==
    
    match decode_from_base64(&encoded) {
        Ok(decoded) => println!("Декодирано: {}", decoded),  // Hello, World!
        Err(e) => println!("Грешка: {}", e)
    }
}

Гранични случаи и съображения

Когато работите с кодиране и декодиране на Base64, бъдете внимателни с тези важни съображения:

  1. Юникод и не-ASCII символи: Когато кодирате текст с не-ASCII символи, уверете се, че използвате правилно кодиране на символи (обикновено UTF-8) преди кодиране на Base64.

  2. Допълване: Стандартният Base64 използва допълване с "=" символи, за да гарантира, че дължината на изхода е кратна на 4. Някои реализации позволяват пропускане на допълнението, което може да предизвика проблеми с съвместимостта.

  3. Нови редове: Традиционните реализации на Base64 вмъкват нови редове (обикновено на всеки 76 символа) за четимост, но съвременните приложения често ги пропускат.

  4. URL-безопасен Base64: Стандартният Base64 използва "+" и "/" символи, които имат специални значения в URL адресите. За контексти на URL, използвайте URL-безопасен Base64, който заменя тези с "-" и "_".

  5. Празни пространства: При декодиране, някои реализации са толерантни и игнорират празни пространства, докато други изискват точно вход.

  6. Увеличение на размера: Кодиране на Base64 увеличава размера на данните с приблизително 33% (4 изходни байта за всеки 3 входни байта).

  7. Производителност: Кодиране/декодиране на Base64 може да бъде изчислително интензивно за много големи данни. Обмислете поточни подходи за големи файлове.

Референции

  1. RFC 4648 - Кодиранията Base16, Base32 и Base64
  2. RFC 2045 - MIME Част Първа: Формат на интернет съобщения
  3. MDN Web Docs: Кодиране и декодиране на Base64
  4. Base64 - Уикипедия
  5. MIME - Уикипедия
Feedback