Whiz Tools

Base64 Kodlayıcı/Çözücü

Metni Base64 kodlamasına ve Base64'ten geri dönüştürün

Kopyala

Base64 Kodlayıcı ve Çözücü

Giriş

Base64, ikili verileri ASCII dize formatında temsil eden bir ikili-şeye kodlama şemasınıdır. İkili formatlarda saklanan verilerin yalnızca güvenilir bir şekilde metin içeriğini destekleyen kanallar üzerinden taşınmasını sağlamak için tasarlanmıştır. Base64 kodlaması, ikili verileri, metin tabanlı protokoller üzerinden güvenli bir şekilde iletilebilecek 64 karakterlik bir küme haline dönüştürür (bu nedenle adı).

Base64 karakter seti şunlardan oluşur:

  • Büyük harfler A-Z (26 karakter)
  • Küçük harfler a-z (26 karakter)
  • Rakamlar 0-9 (10 karakter)
  • Genellikle "+" ve "/" olan iki ek karakter (2 karakter)

Bu araç, metni Base64 formatına kolayca kodlamanıza veya Base64 dizelerini orijinal metinlerine geri çözmenize olanak tanır. Geliştiriciler, BT profesyonelleri ve metin tabanlı kanallar üzerinden güvenli bir şekilde iletilmesi gereken verilerle çalışan herkes için özellikle yararlıdır.

Base64 Kodlamanın Çalışma Prensibi

Kodlama Süreci

Base64 kodlaması, her üç baytlık (24 bit) ikili veri grubunu dört Base64 karakterine dönüştürerek çalışır. Süreç şu adımları takip eder:

  1. Giriş metnini ikili temsil şekline çevirin (ASCII veya UTF-8 kodlaması kullanarak)
  2. İkili verileri 24 bitlik parçalara (3 bayt) gruplandırın
  3. Her 24 bitlik parçayı dört 6 bitlik gruba ayırın
  4. Her 6 bitlik grubu karşılık gelen Base64 karakterine dönüştürün

Giriş uzunluğu 3'e tam bölünmediğinde, 4:3 oranını korumak için "=" karakterleri ile doldurma yapılır.

Matematiksel Temsil

Bir bayt dizisi b1,b2,b3b_1, b_2, b_3 için, karşılık gelen Base64 karakterleri c1,c2,c3,c4c_1, c_2, c_3, c_4 şu şekilde hesaplanır:

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

Burada Base64[i]\text{Base64}[i] ii-inci karakterin Base64 alfabesindeki temsilidir.

Çözme Süreci

Base64 çözme, kodlama sürecini tersine çevirir:

  1. Her Base64 karakterini 6 bitlik değerine dönüştürün
  2. Bu 6 bitlik değerleri birleştirin
  3. Bitleri 8 bitlik parçalara (baytlar) gruplandırın
  4. Her baytı karşılık gelen karakterine dönüştürün

Doldurma

Kodlanacak bayt sayısı 3'e tam bölünmediğinde doldurma uygulanır:

  • Eğer bir bayt kalmışsa, iki Base64 karakterine dönüştürülür ve "==" ile doldurulur
  • Eğer iki bayt kalmışsa, üç Base64 karakterine dönüştürülür ve "=" ile doldurulur

Örnek

"Hello" metnini Base64'e kodlayalım:

  1. "Hello"nun ASCII temsili: 72 101 108 108 111
  2. İkili temsili: 01001000 01100101 01101100 01101100 01101111
  3. 6 bitlik parçalara gruplama: 010010 000110 010101 101100 011011 000110 1111
  4. Son parça sadece 4 bit içeriyor, bu yüzden sıfırlarla dolduruyoruz: 010010 000110 010101 101100 011011 000110 111100
  5. Onaltılık değere dönüştürme: 18, 6, 21, 44, 27, 6, 60
  6. Base64 alfabesinde arama: S, G, V, s, b, G, 8
  7. Sonuç "SGVsbG8="

Giriş uzunluğunun (5 bayt) 3'e tam bölünmediği için sonunda "=" doldurmasını not edin.

Formül

Base64 kodlanmış bir dizenin uzunluğunu hesaplamak için genel formül:

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

Burada x\lceil x \rceil tavan fonksiyonunu temsil eder (en yakın tam sayıya yuvarlama).

Kullanım Alanları

Base64 kodlaması çeşitli uygulamalarda yaygın olarak kullanılır:

  1. E-posta Ekleri: MIME (Çok Amaçlı İnternet Posta Uzantıları) ikili ekleri e-postada kodlamak için Base64 kullanır.

  2. Veri URL'leri: Küçük resimleri, fontları veya diğer kaynakları doğrudan HTML, CSS veya JavaScript içinde data: URL şeması kullanarak gömme.

  3. API İletişimi: JSON yüklerinde veya diğer metin tabanlı API formatlarında ikili verileri güvenli bir şekilde iletmek.

  4. Metin Formatlarında İkili Veri Saklama: İkili verilerin XML, JSON veya diğer metin tabanlı formatlarda saklanması gerektiğinde.

  5. Kimlik Doğrulama Sistemleri: HTTP'de Temel Kimlik Doğrulama Base64 kodlaması kullanır (ancak bu güvenlik için değil, yalnızca kodlama içindir).

  6. Kriptografi: Çeşitli kriptografik protokoller ve sistemlerin bir parçası olarak, genellikle anahtarları veya sertifikaları kodlamak için.

  7. Çerez Değerleri: Çerezlerde saklanmak üzere karmaşık veri yapılarını kodlama.

Alternatifler

Base64 yaygın olarak kullanılsa da, belirli durumlarda daha uygun olabilecek alternatifler vardır:

  1. URL-güvenli Base64: "+" ve "/" yerine "-" ve "_" kullanan bir varyant, URL kodlama sorunlarını önlemek için. URL'lerde yer alacak veriler için yararlıdır.

  2. Base32: 32 karakter seti kullanır, bu da daha uzun çıktı sağlar ancak daha iyi insan okunabilirliği ve büyük/küçük harf duyarsızlığı sunar.

  3. Hex Kodlama: Onaltılıya basit dönüşüm, daha az verimli (boyutu iki katına çıkarır) ancak çok basit ve yaygın olarak desteklenir.

  4. İkili Transfer: Büyük dosyalar veya verimliliğin kritik olduğu durumlarda, uygun İçerik Türü başlıkları ile HTTP gibi doğrudan ikili transfer protokolleri tercih edilir.

  5. Sıkıştırma + Base64: Büyük metin verileri için, kodlamadan önce sıkıştırma yapmak boyut artışını azaltabilir.

  6. JSON/XML Serileştirmesi: Yapılandırılmış veriler için, Base64 kodlamasından daha uygun olabilecek yerel JSON veya XML serileştirmesi kullanmak daha uygun olabilir.

Tarihçe

Base64 kodlaması, ikili verilerin metin için tasarlanmış kanallar üzerinden iletilmesi gerektiği erken bilgisayar ve telekomünikasyon sistemlerine kök salmıştır.

Base64'ün resmi spesifikasyonu ilk olarak 1987'de RFC 989 olarak yayımlandı ve Gizlilik Geliştirilmiş Posta (PEM) tanımlandı. Bu daha sonra RFC 1421 (1993) ve RFC 2045 (1996, MIME'in bir parçası olarak) ile güncellendi.

"Base64" terimi, kodlamanın ikili verileri temsil etmek için 64 farklı ASCII karakteri kullanmasından gelmektedir. Bu 64 karakterin seçimi kasıtlıydı, çünkü 64 bir 2'nin kuvvetidir (2^6), bu da ikili ve Base64 arasında dönüşümü verimli hale getirir.

Zamanla, birkaç Base64 varyantı ortaya çıkmıştır:

  • Standart Base64: RFC 4648'de tanımlandığı gibi, A-Z, a-z, 0-9, +, / ve = ile doldurma kullanır
  • URL-güvenli Base64: URL kodlama sorunlarını önlemek için + ve / yerine - ve _ kullanır
  • Dosya adı-güvenli Base64: Dosya adlarında kullanılmak üzere tasarlanmış benzer bir URL-güvenli varyant
  • IMAP için Değiştirilmiş Base64: IMAP protokolünde farklı özel karakter seti ile kullanılır

Üç on yılın üzerinde bir süre geçmesine rağmen, Base64 modern bilgisayarlarda temel bir araç olmaya devam etmektedir, özellikle web uygulamaları ve JSON gibi metin tabanlı veri formatlarına dayanan API'lerin artışıyla.

Kod Örnekleri

İşte çeşitli programlama dillerinde Base64 kodlama ve çözme örnekleri:

// JavaScript Base64 Kodlama/Çözme
function encodeToBase64(text) {
  return btoa(text);
}

function decodeFromBase64(base64String) {
  try {
    return atob(base64String);
  } catch (e) {
    throw new Error("Geçersiz Base64 dizisi");
  }
}

// Örnek kullanım
const originalText = "Hello, World!";
const encoded = encodeToBase64(originalText);
console.log("Kodlanmış:", encoded);  // SGVsbG8sIFdvcmxkIQ==

try {
  const decoded = decodeFromBase64(encoded);
  console.log("Çözülmüş:", decoded);  // Hello, World!
} catch (error) {
  console.error(error.message);
}
# Python Base64 Kodlama/Çözme
import base64

def encode_to_base64(text):
    # Dizeyi baytlara dönüştür ve sonra kodla
    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 dizesini baytlara dönüştür ve sonra çöz
        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"Geçersiz Base64 dizisi: {e}")

# Örnek kullanım
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
print(f"Kodlanmış: {encoded}")  # SGVsbG8sIFdvcmxkIQ==

try:
    decoded = decode_from_base64(encoded)
    print(f"Çözülmüş: {decoded}")  # Hello, World!
except ValueError as e:
    print(e)
// Java Base64 Kodlama/Çözme
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("Geçersiz Base64 dizisi: " + e.getMessage());
        }
    }
    
    public static void main(String[] args) {
        String originalText = "Hello, World!";
        String encoded = encodeToBase64(originalText);
        System.out.println("Kodlanmış: " + encoded);  // SGVsbG8sIFdvcmxkIQ==
        
        try {
            String decoded = decodeFromBase64(encoded);
            System.out.println("Çözülmüş: " + decoded);  // Hello, World!
        } catch (IllegalArgumentException e) {
            System.err.println(e.getMessage());
        }
    }
}
<?php
// PHP Base64 Kodlama/Çözme
function encodeToBase64($text) {
    return base64_encode($text);
}

function decodeFromBase64($base64String) {
    $decoded = base64_decode($base64String, true);
    if ($decoded === false) {
        throw new Exception("Geçersiz Base64 dizisi");
    }
    return $decoded;
}

// Örnek kullanım
$originalText = "Hello, World!";
$encoded = encodeToBase64($originalText);
echo "Kodlanmış: " . $encoded . "\n";  // SGVsbG8sIFdvcmxkIQ==

try {
    $decoded = decodeFromBase64($encoded);
    echo "Çözülmüş: " . $decoded . "\n";  // Hello, World!
} catch (Exception $e) {
    echo "Hata: " . $e->getMessage() . "\n";
}
?>
// C# Base64 Kodlama/Çözme
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("Geçersiz Base64 dizisi");
        }
    }
    
    static void Main()
    {
        string originalText = "Hello, World!";
        string encoded = EncodeToBase64(originalText);
        Console.WriteLine($"Kodlanmış: {encoded}");  // SGVsbG8sIFdvcmxkIQ==
        
        try
        {
            string decoded = DecodeFromBase64(encoded);
            Console.WriteLine($"Çözülmüş: {decoded}");  // Hello, World!
        }
        catch (FormatException e)
        {
            Console.WriteLine($"Hata: {e.Message}");
        }
    }
}
# Ruby Base64 Kodlama/Çözme
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 "Geçersiz Base64 dizisi: #{e.message}"
  end
end

# Örnek kullanım
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
puts "Kodlanmış: #{encoded}"  # SGVsbG8sIFdvcmxkIQ==

begin
  decoded = decode_from_base64(encoded)
  puts "Çözülmüş: #{decoded}"  # Hello, World!
rescue StandardError => e
  puts "Hata: #{e.message}"
end
// Go Base64 Kodlama/Çözme
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("geçersiz Base64 dizisi: %v", err)
    }
    return string(bytes), nil
}

func main() {
    originalText := "Hello, World!"
    encoded := encodeToBase64(originalText)
    fmt.Println("Kodlanmış:", encoded)  // SGVsbG8sIFdvcmxkIQ==
    
    decoded, err := decodeFromBase64(encoded)
    if err != nil {
        fmt.Println("Hata:", err)
    } else {
        fmt.Println("Çözülmüş:", decoded)  // Hello, World!
    }
}
// Swift Base64 Kodlama/Çözme
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
}

// Örnek kullanım
let originalText = "Hello, World!"
if let encoded = encodeToBase64(originalText) {
    print("Kodlanmış: \(encoded)")  // SGVsbG8sIFdvcmxkIQ==
    
    if let decoded = decodeFromBase64(encoded) {
        print("Çözülmüş: \(decoded)")  // Hello, World!
    } else {
        print("Hata: Base64 dizisi çözülemedi")
    }
} else {
    print("Hata: Metin kodlanamadı")
}
' Excel VBA Base64 Kodlama/Çözme
' Not: Bu, Microsoft XML, v6.0'a referans gerektirir
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 = "Hata: Geçersiz Base64 dizisi"
End Function

' Bir çalışma sayfasında kullanım:
' =EncodeToBase64("Hello, World!")
' =DecodeFromBase64("SGVsbG8sIFdvcmxkIQ==")
# R Base64 Kodlama/Çözme
# 'base64enc' paketini gerektirir
# install.packages("base64enc")
library(base64enc)

encode_to_base64 <- function(text) {
  # Metni ham baytlara dönüştür ve sonra kodla
  text_raw <- charToRaw(text)
  base64_encoded <- base64encode(text_raw)
  return(rawToChar(base64_encoded))
}

decode_from_base64 <- function(base64_string) {
  tryCatch({
    # Base64 dizesini ham baytlara dönüştür ve sonra çöz
    base64_raw <- charToRaw(base64_string)
    decoded_raw <- base64decode(base64_raw)
    return(rawToChar(decoded_raw))
  }, error = function(e) {
    stop(paste("Geçersiz Base64 dizisi:", e$message))
  })
}

# Örnek kullanım
original_text <- "Hello, World!"
encoded <- encode_to_base64(original_text)
cat("Kodlanmış:", encoded, "\n")  # SGVsbG8sIFdvcmxkIQ==

tryCatch({
  decoded <- decode_from_base64(encoded)
  cat("Çözülmüş:", decoded, "\n")  # Hello, World!
}, error = function(e) {
  cat("Hata:", e$message, "\n")
})
% MATLAB Base64 Kodlama/Çözme
function demo_base64()
    originalText = 'Hello, World!';
    
    % Kodla
    encoded = encode_to_base64(originalText);
    fprintf('Kodlanmış: %s\n', encoded);  % SGVsbG8sIFdvcmxkIQ==
    
    % Çöz
    try
        decoded = decode_from_base64(encoded);
        fprintf('Çözülmüş: %s\n', decoded);  % Hello, World!
    catch e
        fprintf('Hata: %s\n', e.message);
    end
end

function encoded = encode_to_base64(text)
    % Metni uint8 dizisine dönüştür ve kodla
    bytes = uint8(text);
    encoded = base64encode(bytes);
end

function decoded = decode_from_base64(base64String)
    try
        % Base64 dizesini uint8 dizisine dönüştür
        bytes = base64decode(base64String);
        decoded = char(bytes);
    catch
        error('Geçersiz Base64 dizisi');
    end
end
// C Base64 Kodlama/Çözme OpenSSL kullanarak
#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; // Geçersiz Base64 girişi
    }
    
    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("Kodlanmış: %s\n", encoded);  // SGVsbG8sIFdvcmxkIQ==
    
    char* decoded = decode_from_base64(encoded);
    if (decoded) {
        printf("Çözülmüş: %s\n", decoded);  // Hello, World!
        free(decoded);
    } else {
        printf("Hata: Geçersiz Base64 dizisi\n");
    }
    
    free(encoded);
    
    return 0;
}
// Rust Base64 Kodlama/Çözme
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!("Geçersiz UTF-8 dizisi: {}", e))
            }
        },
        Err(e) => Err(format!("Geçersiz Base64 dizisi: {}", e))
    }
}

fn main() {
    let original_text = "Hello, World!";
    let encoded = encode_to_base64(original_text);
    println!("Kodlanmış: {}", encoded);  // SGVsbG8sIFdvcmxkIQ==
    
    match decode_from_base64(&encoded) {
        Ok(decoded) => println!("Çözülmüş: {}", decoded),  // Hello, World!
        Err(e) => println!("Hata: {}", e)
    }
}

Kenar Durumları ve Dikkate Alınacak Hususlar

Base64 kodlaması ve çözmesi ile çalışırken, bu önemli hususlara dikkat edin:

  1. Unicode ve ASCII Olmayan Karakterler: ASCII olmayan karakterlerle metin kodlarken, Base64 kodlamasından önce uygun karakter kodlamasını (genellikle UTF-8) sağladığınızdan emin olun.

  2. Doldurma: Standart Base64, çıktı uzunluğunun 4'ün katı olmasını sağlamak için "=" karakterleri ile doldurma kullanır. Bazı uygulamalar doldurmayı atlamaya izin verir, bu da uyumluluk sorunlarına yol açabilir.

  3. Satır Sonları: Geleneksel Base64 uygulamaları okunabilirlik için satır sonları ekler (genellikle her 76 karakterde), ancak modern uygulamalar genellikle bunları atlar.

  4. URL-Güvenli Base64: Standart Base64, "+" ve "/" karakterlerini kullanır; bu karakterler URL'lerde özel anlamlara sahiptir. URL bağlamlarında URL-güvenli Base64 kullanın.

  5. Boşluk: Çözme sırasında bazı uygulamalar hoşgörülü olup boşlukları yok sayarken, diğerleri tam girişi gerektirir.

  6. Boyut Artışı: Base64 kodlaması, verilerin boyutunu yaklaşık %33 oranında artırır (3 baytlık her girdi için 4 bayt çıktı).

  7. Performans: Base64 kodlama/çözme, çok büyük veriler için hesaplama açısından yoğun olabilir. Büyük dosyalar için akış yöntemlerini düşünün.

Referanslar

  1. RFC 4648 - Base16, Base32 ve Base64 Veri Kodlamaları
  2. RFC 2045 - MIME Bölüm Bir: İnternet Mesajı Gövdesinin Biçimi
  3. MDN Web Belgeleri: Base64 kodlama ve çözme
  4. Base64 - Vikipedi
  5. MIME - Vikipedi
Feedback