Whiz Tools

Κωδικοποιητής/Αποκωδικοποιητής Base64

Μετατροπή κειμένου σε και από κωδικοποίηση Base64

Αντιγραφή

Κωδικοποιητής και Αποκωδικοποιητής Base64

Εισαγωγή

Το Base64 είναι ένα σχήμα κωδικοποίησης δυαδικού προς κείμενο που αναπαριστά δυαδικά δεδομένα σε μορφή ASCII. Σχεδιάστηκε για να μεταφέρει δεδομένα που αποθηκεύονται σε δυαδικές μορφές μέσω καναλιών που υποστηρίζουν αξιόπιστα μόνο περιεχόμενο κειμένου. Η κωδικοποίηση Base64 μετατρέπει τα δυαδικά δεδομένα σε ένα σύνολο 64 χαρακτήρων (γι' αυτό και το όνομα) που μπορούν να μεταδοθούν με ασφάλεια μέσω πρωτοκόλλων που βασίζονται σε κείμενο χωρίς διαφθορά δεδομένων.

Το σύνολο χαρακτήρων Base64 αποτελείται από:

  • Κεφαλαία γράμματα A-Z (26 χαρακτήρες)
  • Μικρά γράμματα a-z (26 χαρακτήρες)
  • Ψηφία 0-9 (10 χαρακτήρες)
  • Δύο επιπλέον χαρακτήρες, συνήθως "+" και "/" (2 χαρακτήρες)

Αυτό το εργαλείο σας επιτρέπει να κωδικοποιείτε εύκολα κείμενο σε μορφή Base64 ή να αποκωδικοποιείτε συμβολοσειρές Base64 πίσω στο αρχικό τους κείμενο. Είναι ιδιαίτερα χρήσιμο για προγραμματιστές, επαγγελματίες IT και οποιονδήποτε εργάζεται με δεδομένα που χρειάζεται να μεταδοθούν με ασφάλεια μέσω καναλιών που βασίζονται σε κείμενο.

Πώς Λειτουργεί η Κωδικοποίηση Base64

Διαδικασία Κωδικοποίησης

Η κωδικοποίηση Base64 λειτουργεί μετατρέποντας κάθε ομάδα τριών byte (24 bit) δυαδικών δεδομένων σε τέσσερις χαρακτήρες Base64. Η διαδικασία ακολουθεί τα εξής βήματα:

  1. Μετατρέψτε το εισαγόμενο κείμενο στην δυαδική του αναπαράσταση (χρησιμοποιώντας κωδικοποίηση ASCII ή UTF-8)
  2. Ομαδοποιήστε τα δυαδικά δεδομένα σε κομμάτια των 24 bit (3 byte)
  3. Χωρίστε κάθε κομμάτι 24 bit σε τέσσερις ομάδες 6 bit
  4. Μετατρέψτε κάθε ομάδα 6 bit στον αντίστοιχο χαρακτήρα Base64

Όταν το μήκος του εισαγόμενου δεν είναι διαιρετό με το 3, προστίθεται padding με χαρακτήρες "=" για να διατηρηθεί η αναλογία 4:3 των εξόδων προς τις εισόδους.

Μαθηματική Αναπαράσταση

Για μια ακολουθία byte 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 bit του
  2. Συγκεντρώστε αυτές τις τιμές 6 bit
  3. Ομαδοποιήστε τα bits σε κομμάτια των 8 bit (byte)
  4. Μετατρέψτε κάθε byte στον αντίστοιχο χαρακτήρα του

Padding

Όταν ο αριθμός των byte προς κωδικοποίηση δεν είναι διαιρετός με το 3, εφαρμόζεται padding:

  • Αν υπάρχει ένα byte που απομένει, μετατρέπεται σε δύο χαρακτήρες Base64 ακολουθούμενους από "=="
  • Αν υπάρχουν δύο byte που απομένουν, μετατρέπονται σε τρεις χαρακτήρες Base64 ακολουθούμενους από "="

Παράδειγμα

Ας κωδικοποιήσουμε το κείμενο "Hello" σε Base64:

  1. Αναπαράσταση ASCII του "Hello": 72 101 108 108 111
  2. Δυαδική αναπαράσταση: 01001000 01100101 01101100 01101100 01101111
  3. Ομαδοποίηση σε κομμάτια 6 bit: 010010 000110 010101 101100 011011 000110 1111
  4. Το τελευταίο κομμάτι έχει μόνο 4 bits, οπότε προσθέτουμε padding με μηδενικά: 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="

Σημειώστε το padding "=" στο τέλος επειδή το μήκος της εισόδου (5 byte) δεν είναι διαιρετό με το 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 για να κωδικοποιήσει δυαδικά συνημμένα σε email.

  2. Δεδομένα URLs: Ενσωμάτωση μικρών εικόνων, γραμματοσειρών ή άλλων πόρων απευθείας σε HTML, CSS ή JavaScript χρησιμοποιώντας το σχήμα URL data:.

  3. Επικοινωνίες API: Ασφαλής μετάδοση δυαδικών δεδομένων σε φορτία JSON ή άλλες μορφές API που βασίζονται σε κείμενο.

  4. Αποθήκευση Δυαδικών Δεδομένων σε Κείμενες Μορφές: Όταν δυαδικά δεδομένα χρειάζεται να αποθηκευτούν σε XML, JSON ή άλλες μορφές που βασίζονται σε κείμενο.

  5. Συστήματα Αυθεντικοποίησης: Η Βασική Αυθεντικοποίηση στο HTTP χρησιμοποιεί κωδικοποίηση Base64 (αν και δεν είναι για ασφάλεια, απλώς για κωδικοποίηση).

  6. Κρυπτογραφία: Ως μέρος διαφόρων πρωτοκόλλων και συστημάτων κρυπτογραφίας, συχνά για την κωδικοποίηση κλειδιών ή πιστοποιητικών.

  7. Τιμές Cookie: Κωδικοποίηση σύνθετων δομών δεδομένων για αποθήκευση σε cookies.

Εναλλακτικές

Ενώ το Base64 χρησιμοποιείται ευρέως, υπάρχουν εναλλακτικές που μπορεί να είναι πιο κατάλληλες σε ορισμένες περιπτώσεις:

  1. URL-safe Base64: Μια παραλλαγή που χρησιμοποιεί "-" και "_" αντί για "+" και "/" για να αποφευχθούν προβλήματα κωδικοποίησης URL. Χρήσιμο για δεδομένα που θα συμπεριληφθούν σε URLs.

  2. Base32: Χρησιμοποιεί ένα σύνολο 32 χαρακτήρων, με αποτέλεσμα μεγαλύτερη έξοδο αλλά με καλύτερη αναγνωσιμότητα για ανθρώπους και χωρίς ευαισθησία σε πεζά-κεφαλαία.

  3. Κωδικοποίηση Hex: Απλή μετατροπή σε δεκαεξαδικό, που είναι λιγότερο αποδοτική (διπλασιάζει το μέγεθος) αλλά πολύ απλή και ευρέως υποστηριζόμενη.

  4. Δυαδική Μεταφορά: Για μεγάλα αρχεία ή όταν η αποδοτικότητα είναι κρίσιμη, οι απευθείας δυαδικές μεταφορές μέσω πρωτοκόλλων όπως το HTTP με κατάλληλες κεφαλίδες Content-Type είναι προτιμότερες.

  5. Συμπίεση + Base64: Για μεγάλα κείμενα, η συμπίεση πριν από την κωδικοποίηση μπορεί να μετριάσει την αύξηση του μεγέθους.

  6. Σειριοποίηση JSON/XML: Για δομημένα δεδομένα, η χρήση εγγενών σειριοποιήσεων JSON ή XML μπορεί να είναι πιο κατάλληλη από την κωδικοποίηση Base64.

Ιστορία

Η κωδικοποίηση Base64 έχει τις ρίζες της στους πρώτους υπολογιστές και τα τηλεπικοινωνιακά συστήματα όπου δυαδικά δεδομένα έπρεπε να μεταδοθούν μέσω καναλιών σχεδιασμένων για κείμενο.

Η επίσημη προδιαγραφή του Base64 δημοσιεύθηκε για πρώτη φορά το 1987 ως μέρος του RFC 989, το οποίο καθόρισε το Privacy Enhanced Mail (PEM). Αυτό ενημερώθηκε αργότερα στο RFC 1421 (1993) και το RFC 2045 (1996, ως μέρος του MIME).

Ο όρος "Base64" προέρχεται από το γεγονός ότι η κωδικοποίηση χρησιμοποιεί 64 διαφορετικούς ASCII χαρακτήρες για να αναπαραστήσει δυαδικά δεδομένα. Αυτή η επιλογή 64 χαρακτήρων έγινε σκόπιμα, καθώς το 64 είναι δύναμη του 2 (2^6), γεγονός που καθιστά τη μετατροπή μεταξύ δυαδικών και Base64 αποδοτική.

Με την πάροδο του χρόνου, έχουν προκύψει αρκετές παραλλαγές του Base64:

  • Standard Base64: Όπως καθορίζεται στο RFC 4648, χρησιμοποιώντας A-Z, a-z, 0-9, +, / και = για padding
  • URL-safe Base64: Χρησιμοποιεί - και _ αντί για + και / για να αποφευχθούν προβλήματα κωδικοποίησης URL
  • Filename-safe Base64: Παρόμοιο με το URL-safe, σχεδιασμένο για χρήση σε ονόματα αρχείων
  • Τροποποιημένο Base64 για IMAP: Χρησιμοποιείται στο πρωτόκολλο IMAP με διαφορετικό σύνολο ειδικών χαρακτήρων

Παρά το γεγονός ότι είναι πάνω από τριάντα ετών, το Base64 παραμένει ένα θεμελιώδες εργαλείο στη σύγχρονη υπολογιστική, ιδιαίτερα με την άνοδο των διαδικτυακών εφαρμογών και των API που βασίζονται σε μεγάλο βαθμό σε μορφές δεδομένων κειμένου όπως το JSON.

Παραδείγματα Κώδικα

Ακολουθούν παραδείγματα κωδικοποίησης και αποκωδικοποίησης Base64 σε διάφορες γλώσσες προγραμματισμού:

// Κωδικοποίηση/Αποκωδικοποίηση Base64 σε JavaScript
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);
}
# Κωδικοποίηση/Αποκωδικοποίηση Base64 σε Python
import base64

def encode_to_base64(text):
    # Μετατροπή της συμβολοσειράς σε bytes και στη συνέχεια κωδικοποίηση
    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 σε bytes και στη συνέχεια αποκωδικοποίηση
        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)
// Κωδικοποίηση/Αποκωδικοποίηση Base64 σε 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("Μη έγκυρη συμβολοσειρά 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
// Κωδικοποίηση/Αποκωδικοποίηση Base64 σε PHP
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";
}
?>
// Κωδικοποίηση/Αποκωδικοποίηση Base64 σε 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("Μη έγκυρη συμβολοσειρά 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}");
        }
    }
}
# Κωδικοποίηση/Αποκωδικοποίηση Base64 σε 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 "Μη έγκυρη συμβολοσειρά 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
// Κωδικοποίηση/Αποκωδικοποίηση Base64 σε 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("μη έγκυρη συμβολοσειρά 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!
    }
}
// Κωδικοποίηση/Αποκωδικοποίηση Base64 σε 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
}

// Παράδειγμα χρήσης
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("Σφάλμα: Δεν ήταν δυνατή η κωδικοποίηση του κειμένου")
}
' Κωδικοποίηση/Αποκωδικοποίηση Base64 σε Excel VBA
' Σημείωση: Αυτό απαιτεί αναφορά στη 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==")
# Κωδικοποίηση/Αποκωδικοποίηση Base64 σε R
# Απαιτεί την βιβλιοθήκη 'base64enc'
# install.packages("base64enc")
library(base64enc)

encode_to_base64 <- function(text) {
  # Μετατροπή του κειμένου σε raw bytes, στη συνέχεια κωδικοποίηση
  text_raw <- charToRaw(text)
  base64_encoded <- base64encode(text_raw)
  return(rawToChar(base64_encoded))
}

decode_from_base64 <- function(base64_string) {
  tryCatch({
    # Μετατροπή της συμβολοσειράς base64 σε raw, στη συνέχεια αποκωδικοποίηση
    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")
})
% Κωδικοποίηση/Αποκωδικοποίηση Base64 σε MATLAB
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
// Κωδικοποίηση/Αποκωδικοποίηση Base64 σε C χρησιμοποιώντας 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;
}
// Κωδικοποίηση/Αποκωδικοποίηση Base64 σε 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!("Μη έγκυρη ακολουθία 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. Unicode και Μη-ASCII Χαρακτήρες: Όταν κωδικοποιείτε κείμενο με μη-ASCII χαρακτήρες, βεβαιωθείτε ότι η σωστή κωδικοποίηση χαρακτήρων (συνήθως UTF-8) χρησιμοποιείται πριν από την κωδικοποίηση Base64.

  2. Padding: Το Standard Base64 χρησιμοποιεί padding με χαρακτήρες "=" για να διασφαλίσει ότι το μήκος εξόδου είναι πολλαπλάσιο του 4. Ορισμένες υλοποιήσεις επιτρέπουν την παράλειψη του padding, γεγονός που μπορεί να προκαλέσει προβλήματα συμβατότητας.

  3. Διαλείμματα Γραμμών: Οι παραδοσιακές υλοποιήσεις Base64 εισάγουν διαλείμματα γραμμών (συνήθως κάθε 76 χαρακτήρες) για αναγνωσιμότητα, αλλά οι σύγχρονες εφαρμογές συχνά τα παραλείπουν.

  4. URL-Safe Base64: Το Standard Base64 χρησιμοποιεί τους χαρακτήρες "+" και "/" που έχουν ειδικές σημασίες σε URLs. Για περιβάλλοντα URL, χρησιμοποιήστε το URL-safe Base64 που αντικαθιστά αυτούς με "-" και "_".

  5. Λευκοί Χώροι: Κατά την αποκωδικοποίηση, ορισμένες υλοποιήσεις είναι επιεικείς και αγνοούν τους λευκούς χώρους, ενώ άλλες απαιτούν ακριβή είσοδο.

  6. Αύξηση Μεγέθους: Η κωδικοποίηση Base64 αυξάνει το μέγεθος των δεδομένων κατά περίπου 33% (4 byte εξόδου για κάθε 3 byte εισόδου).

  7. Απόδοση: Η κωδικοποίηση/αποκωδικοποίηση Base64 μπορεί να είναι υπολογιστικά απαιτητική για πολύ μεγάλα δεδομένα. Σκεφτείτε προσεγγίσεις ροής για μεγάλα αρχεία.

Αναφορές

  1. RFC 4648 - Οι κωδικοποιήσεις Base16, Base32 και Base64
  2. RFC 2045 - MIME Μέρος Ένα: Μορφή Σωμάτων Μηνυμάτων Διαδικτύου
  3. MDN Web Docs: Κωδικοποίηση και Αποκωδικοποίηση Base64
  4. Base64 - Βικιπαίδεια
  5. MIME - Βικιπαίδεια
Feedback