Whiz Tools

ตัวเข้ารหัส/ถอดรหัส Base64

แปลงข้อความเป็นและจากการเข้ารหัส Base64

คัดลอก

Base64 Encoder and Decoder

Introduction

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 (Multipurpose Internet Mail Extensions) ใช้ Base64 เพื่อเข้ารหัสไฟล์แนบไบนารีในอีเมล

  2. Data URLs: ฝังภาพเล็กๆ ฟอนต์ หรือทรัพยากรอื่นๆ โดยตรงใน HTML, CSS หรือ JavaScript โดยใช้สคีม่า data:

  3. การสื่อสาร API: ส่งข้อมูลไบนารีอย่างปลอดภัยใน JSON payloads หรือรูปแบบ API ที่เป็นข้อความอื่นๆ

  4. การจัดเก็บข้อมูลไบนารีในรูปแบบข้อความ: เมื่อข้อมูลไบนารีต้องการจัดเก็บใน XML, JSON หรือรูปแบบข้อความอื่นๆ

  5. ระบบการตรวจสอบสิทธิ์: การตรวจสอบสิทธิ์พื้นฐานใน HTTP ใช้การเข้ารหัส Base64 (แม้ว่าไม่ใช่เพื่อความปลอดภัย แต่เพื่อการเข้ารหัส)

  6. การเข้ารหัส: เป็นส่วนหนึ่งของโปรโตคอลและระบบการเข้ารหัสต่างๆ โดยมักใช้สำหรับการเข้ารหัสคีย์หรือใบรับรอง

  7. ค่าในคุกกี้: การเข้ารหัสโครงสร้างข้อมูลที่ซับซ้อนเพื่อจัดเก็บในคุกกี้

ทางเลือก

แม้ว่า Base64 จะใช้กันอย่างแพร่หลาย แต่ก็มีทางเลือกอื่นๆ ที่อาจเหมาะสมกว่าในบางสถานการณ์:

  1. URL-safe Base64: ตัวแปรที่ใช้ "-" และ "_" แทน "+" และ "/" เพื่อหลีกเลี่ยงปัญหาการเข้ารหัส URL เหมาะสำหรับข้อมูลที่จะรวมอยู่ใน URL

  2. Base32: ใช้ชุดอักษร 32 ตัว ส่งผลให้เอาต์พุตยาวขึ้นแต่มีความอ่านง่ายและไม่ไวต่อการใช้ตัวพิมพ์ใหญ่พิมพ์เล็ก

  3. การเข้ารหัส Hex: การแปลงเป็นเลขฐานสิบหกอย่างง่าย ซึ่งมีประสิทธิภาพน้อยกว่า (ทำให้ขนาดเพิ่มขึ้นเป็นสองเท่า) แต่เรียบง่ายและรองรับอย่างกว้างขวาง

  4. การส่งข้อมูลไบนารี: สำหรับไฟล์ขนาดใหญ่หรือเมื่อประสิทธิภาพมีความสำคัญ การส่งข้อมูลไบนารีโดยตรงผ่านโปรโตคอลเช่น HTTP โดยมี header 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" มาจากการที่การเข้ารหัสใช้ตัวอักษร ASCII 64 ตัวเพื่อแทนข้อมูลไบนารี การเลือกใช้ 64 ตัวอักษรนี้เป็นการตั้งใจ เนื่องจาก 64 เป็นเลขยกกำลังของ 2 (2^6) ซึ่งทำให้การแปลงระหว่างไบนารีและ Base64 มีประสิทธิภาพ

ตลอดระยะเวลาหลายปี มีตัวแปรหลายตัวของ Base64 เกิดขึ้น:

  • Standard Base64: ตามที่กำหนดใน RFC 4648 โดยใช้ A-Z, a-z, 0-9, +, / และ = สำหรับการเติม
  • URL-safe Base64: ใช้ - และ _ แทน + และ / เพื่อหลีกเลี่ยงปัญหาการเข้ารหัส URL
  • Filename-safe Base64: คล้ายกับ URL-safe ออกแบบมาเพื่อใช้ในชื่อไฟล์
  • Modified Base64 สำหรับ IMAP: ใช้ในโปรโตคอล IMAP โดยมีชุดอักษรพิเศษที่แตกต่างกัน

แม้ว่าจะมีอายุมากกว่า 30 ปี แต่ Base64 ยังคงเป็นเครื่องมือพื้นฐานในคอมพิวเตอร์สมัยใหม่ โดยเฉพาะอย่างยิ่งกับการเพิ่มขึ้นของแอปพลิเคชันเว็บและ API ที่พึ่งพาฟอร์แมตข้อมูลที่เป็นข้อความอย่างหนัก เช่น JSON

ตัวอย่างโค้ด

นี่คือตัวอย่างการเข้ารหัสและถอดรหัส Base64 ในภาษาการเขียนโปรแกรมต่างๆ:

// JavaScript Base64 Encoding/Decoding
function encodeToBase64(text) {
  return btoa(text);
}

function decodeFromBase64(base64String) {
  try {
    return atob(base64String);
  } catch (e) {
    throw new Error("Invalid Base64 string");
  }
}

// Example usage
const originalText = "Hello, World!";
const encoded = encodeToBase64(originalText);
console.log("Encoded:", encoded);  // SGVsbG8sIFdvcmxkIQ==

try {
  const decoded = decodeFromBase64(encoded);
  console.log("Decoded:", decoded);  // Hello, World!
} catch (error) {
  console.error(error.message);
}
# Python Base64 Encoding/Decoding
import base64

def encode_to_base64(text):
    # Convert string to bytes and then encode
    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:
        # Convert base64 string to bytes and then decode
        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"Invalid Base64 string: {e}")

# Example usage
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
print(f"Encoded: {encoded}")  # SGVsbG8sIFdvcmxkIQ==

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

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

// Example usage
$originalText = "Hello, World!";
$encoded = encodeToBase64($originalText);
echo "Encoded: " . $encoded . "\n";  // SGVsbG8sIFdvcmxkIQ==

try {
    $decoded = decodeFromBase64($encoded);
    echo "Decoded: " . $decoded . "\n";  // Hello, World!
} catch (Exception $e) {
    echo "Error: " . $e->getMessage() . "\n";
}
?>
// C# Base64 Encoding/Decoding
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("Invalid Base64 string");
        }
    }
    
    static void Main()
    {
        string originalText = "Hello, World!";
        string encoded = EncodeToBase64(originalText);
        Console.WriteLine($"Encoded: {encoded}");  // SGVsbG8sIFdvcmxkIQ==
        
        try
        {
            string decoded = DecodeFromBase64(encoded);
            Console.WriteLine($"Decoded: {decoded}");  // Hello, World!
        }
        catch (FormatException e)
        {
            Console.WriteLine($"Error: {e.Message}");
        }
    }
}
# Ruby Base64 Encoding/Decoding
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 "Invalid Base64 string: #{e.message}"
  end
end

# Example usage
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
puts "Encoded: #{encoded}"  # SGVsbG8sIFdvcmxkIQ==

begin
  decoded = decode_from_base64(encoded)
  puts "Decoded: #{decoded}"  # Hello, World!
rescue StandardError => e
  puts "Error: #{e.message}"
end
// Go Base64 Encoding/Decoding
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("invalid Base64 string: %v", err)
    }
    return string(bytes), nil
}

func main() {
    originalText := "Hello, World!"
    encoded := encodeToBase64(originalText)
    fmt.Println("Encoded:", encoded)  // SGVsbG8sIFdvcmxkIQ==
    
    decoded, err := decodeFromBase64(encoded)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Decoded:", decoded)  // Hello, World!
    }
}
// Swift Base64 Encoding/Decoding
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
}

// Example usage
let originalText = "Hello, World!"
if let encoded = encodeToBase64(originalText) {
    print("Encoded: \(encoded)")  // SGVsbG8sIFdvcmxkIQ==
    
    if let decoded = decodeFromBase64(encoded) {
        print("Decoded: \(decoded)")  // Hello, World!
    } else {
        print("Error: Could not decode Base64 string")
    }
} else {
    print("Error: Could not encode text")
}
' Excel VBA Base64 Encoding/Decoding
' Note: This requires a reference to 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 = "Error: Invalid Base64 string"
End Function

' Usage in a worksheet:
' =EncodeToBase64("Hello, World!")
' =DecodeFromBase64("SGVsbG8sIFdvcmxkIQ==")
# R Base64 Encoding/Decoding
# Requires the 'base64enc' package
# install.packages("base64enc")
library(base64enc)

encode_to_base64 <- function(text) {
  # Convert text to raw bytes, then encode
  text_raw <- charToRaw(text)
  base64_encoded <- base64encode(text_raw)
  return(rawToChar(base64_encoded))
}

decode_from_base64 <- function(base64_string) {
  tryCatch({
    # Convert base64 string to raw, then decode
    base64_raw <- charToRaw(base64_string)
    decoded_raw <- base64decode(base64_raw)
    return(rawToChar(decoded_raw))
  }, error = function(e) {
    stop(paste("Invalid Base64 string:", e$message))
  })
}

# Example usage
original_text <- "Hello, World!"
encoded <- encode_to_base64(original_text)
cat("Encoded:", encoded, "\n")  # SGVsbG8sIFdvcmxkIQ==

tryCatch({
  decoded <- decode_from_base64(encoded)
  cat("Decoded:", decoded, "\n")  # Hello, World!
}, error = function(e) {
  cat("Error:", e$message, "\n")
})
% MATLAB Base64 Encoding/Decoding
function demo_base64()
    originalText = 'Hello, World!';
    
    % Encode
    encoded = encode_to_base64(originalText);
    fprintf('Encoded: %s\n', encoded);  % SGVsbG8sIFdvcmxkIQ==
    
    % Decode
    try
        decoded = decode_from_base64(encoded);
        fprintf('Decoded: %s\n', decoded);  % Hello, World!
    catch e
        fprintf('Error: %s\n', e.message);
    end
end

function encoded = encode_to_base64(text)
    % Convert text to uint8 array and encode
    bytes = uint8(text);
    encoded = base64encode(bytes);
end

function decoded = decode_from_base64(base64String)
    try
        % Decode base64 string to uint8 array
        bytes = base64decode(base64String);
        decoded = char(bytes);
    catch
        error('Invalid Base64 string');
    end
end
// C Base64 Encoding/Decoding using 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; // Invalid Base64 input
    }
    
    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("Encoded: %s\n", encoded);  // SGVsbG8sIFdvcmxkIQ==
    
    char* decoded = decode_from_base64(encoded);
    if (decoded) {
        printf("Decoded: %s\n", decoded);  // Hello, World!
        free(decoded);
    } else {
        printf("Error: Invalid Base64 string\n");
    }
    
    free(encoded);
    
    return 0;
}
// Rust Base64 Encoding/Decoding
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!("Invalid UTF-8 sequence: {}", e))
            }
        },
        Err(e) => Err(format!("Invalid Base64 string: {}", e))
    }
}

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

กรณีขอบและข้อพิจารณา

เมื่อทำงานกับการเข้ารหัสและถอดรหัส Base64 ให้ระวังข้อพิจารณาที่สำคัญเหล่านี้:

  1. อักขระ Unicode และ Non-ASCII: เมื่อเข้ารหัสข้อความที่มีอักขระที่ไม่ใช่ 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 - The Base16, Base32, and Base64 Data Encodings
  2. RFC 2045 - MIME Part One: Format of Internet Message Bodies
  3. MDN Web Docs: Base64 encoding and decoding
  4. Base64 - Wikipedia
  5. MIME - Wikipedia
Feedback