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. Email вкладення: MIME (Multipurpose Internet Mail Extensions) використовує Base64 для кодування бінарних вкладень в електронній пошті.

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

  3. API комунікації: Безпечно передавати бінарні дані в JSON навантаженнях або інших текстових форматах API.

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

  5. Системи аутентифікації: Базова аутентифікація в HTTP використовує кодування Base64 (хоча це не для безпеки, а лише для кодування).

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

  7. Значення cookie: Кодування складних структур даних для зберігання в cookie.

Альтернативи

Хоча Base64 широко використовується, існують альтернативи, які можуть бути більш доречними в певних ситуаціях:

  1. Безпечний для URL Base64: Варіант, який використовує "-" і "_" замість "+" і "/" для уникнення проблем з кодуванням URL. Корисно для даних, які будуть включені в URL.

  2. Base32: Використовує набір з 32 символів, що призводить до більшої виходу, але з кращою читабельністю для людини та нечутливістю до регістру.

  3. Шістнадцяткове кодування: Просте перетворення в шістнадцяткову систему, що є менш ефективним (подвоює розмір), але дуже простим і широко підтримуваним.

  4. Бінарна передача: Для великих файлів або коли ефективність є критично важливою, безпосередні бінарні протоколи передачі, такі як HTTP з відповідними заголовками Content-Type, є переважними.

  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^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 - Вікіпедія
Зворотній зв'язок