Whiz Tools

מ encoder/decoder Base64

המר טקסט לקידוד Base64 וממנו

העתק

מקודד ומפענח Base64

מבוא

Base64 הוא מנגנון קידוד בינארי לטקסט המייצג נתונים בינאריים בפורמט מחרוזת ASCII. הוא נועד להעביר נתונים המאוחסנים בפורמטים בינאריים דרך ערוצים התומכים רק בתוכן טקסטואלי. קידוד Base64 ממיר נתונים בינאריים לסט של 64 תווים (ולכן השם) שניתן להעביר בבטחה על פני פרוטוקולים מבוססי טקסט ללא פגיעות בנתונים.

סט התווים של Base64 כולל:

  • אותיות רישיות A-Z (26 תווים)
  • אותיות קטנות a-z (26 תווים)
  • ספרות 0-9 (10 תווים)
  • שני תווים נוספים, בדרך כלל "+" ו-"/" (2 תווים)

כלי זה מאפשר לך בקלות לקודד טקסט לפורמט Base64 או לפענח מחרוזות Base64 חזרה לטקסט המקורי שלהן. זה שימושי במיוחד עבור מפתחים, אנשי מקצוע בתחום ה-IT, וכל מי שעובד עם נתונים שצריכים להיות מועברים בבטחה דרך ערוצים מבוססי טקסט.

איך עובד קידוד 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 (סוגי דואר אינטרנט מרובים) משתמש ב-Base64 כדי לקודד קבצים בינאריים מצורפים בדואר אלקטרוני.

  2. כתובות נתונים: הטמעת תמונות קטנות, גופנים או משאבים אחרים ישירות ב-HTML, CSS או JavaScript באמצעות הסכמת ה-data:.

  3. תקשורת API: העברת נתונים בינאריים בבטחה בטעוני JSON או בפורמטים טקסטואליים אחרים של API.

  4. אחסון נתונים בינאריים בפורמטים טקסטואליים: כאשר נתונים בינאריים צריכים להיות מאוחסנים ב-XML, JSON או פורמטים טקסטואליים אחרים.

  5. מערכות אימות: אימות בסיסי ב-HTTP משתמש בקידוד Base64 (אם כי זה לא למטרות אבטחה, אלא רק לקידוד).

  6. קריפטוגרפיה: כחלק מפרוטוקולים ומערכות קריפטוגרפיות שונות, לעיתים קרובות לקידוד מפתחות או תעודות.

  7. ערכי עוגיות: קידוד מבנים נתונים מורכבים כדי להיות מאוחסנים בעוגיות.

חלופות

בעוד ש-Base64 בשימוש נרחב, ישנן חלופות שעשויות להיות מתאימות יותר במצבים מסוימים:

  1. Base64 בטוח עבור URL: גרסה המשתמשת ב"-" ו-"_" במקום "+" ו-"/" כדי למנוע בעיות קידוד 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 (2^6), מה שהופך את ההמרה בין בינארי ל-Base64 ליעילה.

עם הזמן, כמה וריאציות של Base64 צצו:

  • Base64 סטנדרטי: כפי שהוגדר ב-RFC 4648, שמשתמש ב-A-Z, a-z, 0-9, +, / וב- = עבור ריפוד
  • Base64 בטוח עבור URL: משתמש ב- - ו- _ במקום + ו- / כדי למנוע בעיות קידוד URL
  • Base64 בטוח עבור שמות קבצים: דומה לבסיס-64 בטוח עבור URL, מיועד לשימוש בשמות קבצים
  • Base64 מותאם עבור IMAP: בשימוש בפרוטוקול IMAP עם סט שונה של תווים מיוחדים

למרות שהיא קיימת כבר יותר משלושה עשורים, Base64 נשאר כלי בסיסי במחשוב המודרני, במיוחד עם עליית היישומים וה-APIs המסתמכים בצורה רבה על פורמטים טקסטואליים כמו 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):
    # המרת מחרוזת לבתים ואז קידוד
    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)
// קידוד/פענוח 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 ברובי
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 בשוויצרית
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 ב-VBA של Excel
' הערה: זה דורש הפניה ל-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) {
  # המרת טקסט לבתים גולמיים, ואז קידוד
  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")
})
% קידוד/פענוח 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 ברוסט
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 ודמויות Unicode: כאשר מקודדים טקסט עם תווים לא-ASCII, ודאו שהקידוד הנכון (בדרך כלל UTF-8) מוחל לפני קידוד Base64.

  2. ריפוד: Base64 הסטנדרטי משתמש בריפוד עם תווי "=" כדי להבטיח שאורך הפלט הוא כפולה של 4. כמה יישומים מאפשרים להשמיט ריפוד, מה שעלול לגרום לבעיות תאימות.

  3. שורות חדשות: יישומים מסורתיים של Base64 מכניסים שורות חדשות (בדרך כלל כל 76 תווים) לקריאות, אך יישומים מודרניים לעיתים קרובות משאירים את זה.

  4. Base64 בטוח עבור URL: Base64 הסטנדרטי משתמש בתווים "+" ו-"/" שיש להם משמעויות מיוחדות בכתובות URL. בהקשרים של URL, השתמשו ב-Base64 בטוח עבור URL המחליף את אלה ב-"-" ו-"_".

  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