Wikipedia mengatakan
Skema pengkodean Base64 biasanya digunakan ketika ada kebutuhan untuk menyandikan data biner yang perlu disimpan dan ditransfer melalui media yang dirancang untuk menangani data tekstual. Ini untuk memastikan bahwa data tetap utuh tanpa modifikasi selama transportasi.
Tapi bukankah data selalu disimpan / ditransmisikan dalam biner karena memori yang dimiliki mesin kami menyimpan biner dan itu hanya tergantung bagaimana Anda menafsirkannya? Jadi, apakah Anda menyandikan pola bit 010011010110000101101110
seperti Man
di ASCII atau seperti TWFu
di Base64, Anda akhirnya akan menyimpan pola bit yang sama.
Jika pengkodean terakhir adalah dalam hal nol dan satu dan setiap mesin dan media dapat mengatasinya, bagaimana bedanya jika data direpresentasikan sebagai ASCII atau Base64?
Apa artinya "media yang dirancang untuk menangani data tekstual"? Mereka dapat menangani biner => mereka dapat menangani apa saja.
Terima kasih semuanya, saya pikir saya mengerti sekarang.
Ketika kami mengirim data, kami tidak dapat memastikan bahwa data tersebut akan ditafsirkan dalam format yang sama seperti yang kami inginkan. Jadi, kami mengirim data berkode dalam beberapa format (seperti Base64) yang dimengerti oleh kedua belah pihak. Dengan cara itu bahkan jika pengirim dan penerima mengartikan hal yang sama secara berbeda, tetapi karena mereka menyetujui format kode, data tidak akan ditafsirkan secara salah.
Dari contoh Mark Byers
Jika saya ingin mengirim
Hello
world!
Salah satu caranya adalah mengirimkannya dalam ASCII like
72 101 108 108 111 10 119 111 114 108 100 33
Tetapi byte 10 mungkin tidak ditafsirkan dengan benar sebagai baris baru di ujung lainnya. Jadi, kami menggunakan subset ASCII untuk menyandikannya seperti ini
83 71 86 115 98 71 56 115 67 110 100 118 99 109 120 107 73 61 61
yang dengan biaya lebih banyak data yang ditransfer untuk jumlah informasi yang sama memastikan bahwa penerima dapat mendekode data dengan cara yang dimaksudkan, bahkan jika penerima kebetulan memiliki interpretasi yang berbeda untuk sisa rangkaian karakter.
Jawaban:
Kesalahan pertama Anda adalah berpikir bahwa pengkodean ASCII dan pengkodean Base64 dapat dipertukarkan. Mereka tidak. Mereka digunakan untuk tujuan yang berbeda.
Untuk memahami mengapa Base64 diperlukan, kita perlu sedikit sejarah komputasi.
Komputer berkomunikasi dalam biner - 0s dan 1s - tetapi orang biasanya ingin berkomunikasi dengan data formulir yang lebih kaya seperti teks atau gambar. Untuk mentransfer data ini antara komputer, pertama-tama komputer harus disandikan ke dalam 0s dan 1s, dikirim, lalu diuraikan kembali. Untuk mengambil teks sebagai contoh - ada banyak cara untuk melakukan pengkodean ini. Akan jauh lebih sederhana jika kita semua bisa menyetujui satu pengkodean, tetapi sayangnya ini tidak terjadi.
Awalnya banyak pengkodean yang berbeda dibuat (misalnya kode Baudot ) yang menggunakan jumlah bit yang berbeda per karakter sampai akhirnya ASCII menjadi standar dengan 7 bit per karakter. Namun sebagian besar komputer menyimpan data biner dalam byte yang masing-masing terdiri dari 8 bit sehingga ASCII tidak cocok untuk mentransfer jenis data ini. Beberapa sistem bahkan akan menghapus bit yang paling signifikan. Lebih jauh lagi, perbedaan dalam pengkodean garis akhir di seluruh sistem berarti bahwa karakter ASCII 10 dan 13 juga kadang-kadang dimodifikasi.
Untuk mengatasi masalah ini, pengkodean Base64 diperkenalkan. Ini memungkinkan Anda untuk menyandikan byte aribtrary ke byte yang diketahui aman untuk dikirim tanpa rusak (karakter alfanumerik ASCII dan beberapa simbol). Kerugiannya adalah bahwa pengkodean pesan menggunakan Base64 meningkatkan panjangnya - setiap 3 byte data dikodekan menjadi 4 karakter ASCII.
Untuk mengirim teks andal Anda bisa pertama encode ke byte menggunakan pengkodean teks pilihan Anda (misalnya UTF-8) dan kemudian setelah itu Base64 menyandikan data biner yang dihasilkan menjadi string teks yang aman untuk mengirim disandikan sebagai ASCII. Penerima harus membalik proses ini untuk memulihkan pesan aslinya. Ini tentu saja mengharuskan penerima tahu pengkodean mana yang digunakan, dan informasi ini sering perlu dikirim secara terpisah.
Secara historis telah digunakan untuk menyandikan data biner dalam pesan email di mana server email dapat memodifikasi akhir baris. Contoh yang lebih modern adalah penggunaan pengkodean Base64 untuk menanamkan data gambar secara langsung dalam kode sumber HTML . Di sini perlu untuk menyandikan data untuk menghindari karakter seperti '<' dan '>' ditafsirkan sebagai tag.
Berikut ini contoh kerjanya:
Saya ingin mengirim pesan teks dengan dua baris:
Jika saya mengirimnya sebagai ASCII (atau UTF-8) akan terlihat seperti ini:
Byte 10 rusak di beberapa sistem sehingga kita dapat mendasarkan 64 mengkodekan byte ini sebagai string Base64:
Yang ketika disandikan menggunakan ASCII terlihat seperti ini:
Semua byte di sini dikenal sebagai byte aman, sehingga sangat kecil kemungkinan sistem mana pun akan merusak pesan ini. Saya dapat mengirim ini sebagai ganti pesan asli saya dan membiarkan penerima membalikkan proses untuk memulihkan pesan asli.
sumber
Pengkodean data biner dalam XML
Misalkan Anda ingin menyematkan beberapa gambar dalam dokumen XML. Gambar adalah data biner, sedangkan dokumen XML adalah teks. Tetapi XML tidak bisa menangani data biner yang disematkan. Jadi, bagaimana Anda melakukannya?
Salah satu opsi adalah untuk menyandikan gambar dalam base64, mengubah data biner menjadi teks yang dapat ditangani XML.
Dari pada:
Anda melakukannya:
Dan parser XML akan dapat mengurai dokumen XML dengan benar dan mengekstrak data gambar.
sumber
.mht
kerja format lama Microsoft (file html + gambar dalam satu file).Mengapa tidak melihat RFC yang saat ini mendefinisikan Base64 ?
Base64 pada awalnya dirancang sebagai cara untuk memungkinkan data biner untuk dilampirkan ke email sebagai bagian dari Ekstensi Surat Internet Multiguna.
sumber
Media yang dirancang untuk data tekstual tentu saja akhirnya biner juga, tetapi media tekstual sering menggunakan nilai biner tertentu untuk karakter kontrol. Juga, media tekstual dapat menolak nilai biner tertentu sebagai bukan teks.
Pengkodean Base64 mengkodekan data biner sebagai nilai yang hanya dapat diartikan sebagai teks dalam media tekstual, dan bebas dari karakter khusus dan / atau karakter kontrol, sehingga data tersebut akan disimpan di seluruh media tekstual juga.
sumber
Lebih dari itu media memvalidasi pengkodean string, jadi kami ingin memastikan bahwa data dapat diterima oleh aplikasi penanganan (dan tidak mengandung urutan biner yang mewakili EOL misalnya)
Bayangkan Anda ingin mengirim data biner dalam email dengan pengkodean UTF-8 - Email mungkin tidak ditampilkan dengan benar jika aliran yang dan nol menciptakan urutan yang tidak valid Unicode dalam pengkodean UTF-8.
Jenis hal yang sama terjadi di URL ketika kami ingin menyandikan karakter yang tidak valid untuk URL di URL itu sendiri:
Ini karena kami ingin mengirim ruang ke sistem yang akan berpikir ruangnya bau.
Semua yang kami lakukan adalah memastikan ada pemetaan 1-ke-1 antara urutan bit yang diketahui baik, dapat diterima dan tidak merusak ke urutan bit harfiah lainnya, dan bahwa aplikasi penanganan tidak membedakan pengkodean.
Dalam contoh Anda,
man
mungkin ASCII valid dalam bentuk pertama; tetapi seringkali Anda mungkin ingin mengirimkan nilai-nilai yang biner acak (yaitu mengirim gambar dalam email):Di sini kita melihat bahwa gambar GIF dikodekan dalam base64 sebagai potongan email. Klien email membaca header dan menerjemahkannya. Karena penyandian, kami dapat memastikan GIF tidak mengandung apa pun yang dapat ditafsirkan sebagai protokol dan kami menghindari memasukkan data yang mungkin dianggap signifikan oleh SMTP atau POP.
sumber
Base64 bukannya melarikan diri karakter khusus
Saya akan memberi Anda contoh yang sangat berbeda tetapi nyata: Saya menulis kode javascript untuk dijalankan di browser. Tag HTML memiliki nilai ID, tetapi ada kendala pada karakter apa yang valid dalam ID.
Tapi saya ingin ID saya untuk merujuk file ke sistem file saya. File dalam kenyataan dapat memiliki segala macam karakter aneh dan indah di dalamnya dari tanda seru, karakter beraksen, tilde, bahkan emoji! Saya tidak bisa melakukan ini:
Misalkan saya ingin menjalankan beberapa kode seperti ini:
Saya pikir kode ini akan gagal ketika dijalankan.
Dengan Base64 saya bisa merujuk ke sesuatu yang rumit tanpa khawatir tentang bahasa mana yang memungkinkan karakter khusus apa dan yang perlu melarikan diri:
Tidak seperti menggunakan MD5 atau fungsi hashing lainnya, Anda dapat membalikkan penyandian untuk mengetahui data apa yang sebenarnya berguna.
Saya berharap saya tahu tentang Base64 tahun yang lalu. Saya akan menghindari merobek rambut saya dengan '
encodeURIComponent
' danstr.replace(‘\n’,’\\n’)
Transfer teks SSH:
Jika Anda mencoba untuk melewatkan data yang kompleks melalui ssh (mis. Dotfile sehingga Anda bisa mendapatkan personalisasi shell Anda), semoga berhasil melakukannya tanpa Basis 64. Ini adalah bagaimana Anda akan melakukannya dengan basis 64 (saya tahu Anda bisa menggunakan SCP, tetapi itu akan mengambil banyak perintah - yang merumitkan ikatan kunci untuk sshing ke server):
sumber
Salah satu contoh ketika saya merasa nyaman adalah ketika mencoba menanamkan data biner dalam XML . Beberapa data biner disalahtafsirkan oleh parser SAX karena data tersebut dapat berupa apa saja, termasuk karakter khusus XML. Base64 yang mengkodekan data pada ujung transmisi dan mendekode data pada sisi penerima memperbaiki masalah itu.
sumber
Sebagian besar komputer menyimpan data dalam format biner 8-bit, tetapi ini bukan keharusan. Beberapa mesin dan media transmisi hanya dapat menangani 7 bit (atau bahkan lebih rendah) pada suatu waktu. Media seperti itu akan menafsirkan aliran dalam kelipatan 7 bit, jadi jika Anda mengirim data 8-bit, Anda tidak akan menerima apa yang Anda harapkan di sisi lain. Base-64 hanyalah salah satu cara untuk mengatasi masalah ini: Anda menyandikan input ke dalam format 6-bit, mengirimkannya ke media Anda dan mendekodekannya kembali ke format 8-bit di ujung penerima.
sumber
Selain jawaban lain (agak panjang): bahkan mengabaikan sistem lama yang hanya mendukung ASCII 7-bit, masalah mendasar dengan penyediaan data biner dalam mode teks adalah:
sumber
Bahwa protokol-protokol itu dirancang untuk menangani teks (seringkali, hanya teks bahasa Inggris ) alih-alih data biner (seperti gambar .png dan .jpg).
Tetapi kebalikannya tidak benar. Protokol yang dirancang untuk merepresentasikan teks dapat memperlakukan data biner yang mengandung:
Jadi, Anda tidak bisa hanya mengirim data biner melalui protokol berbasis teks. Anda terbatas pada byte yang mewakili karakter ASCII non-ruang non-kontrol, yang ada 94. Alasan Basis 64 dipilih adalah bahwa lebih cepat untuk bekerja dengan kekuatan dua, dan 64 adalah yang terbesar yang bekerja .
Di Web, setidaknya, kebanyakan dari mereka memilikinya. Mayoritas situs menggunakan UTF-8 .
Masalahnya di Barat adalah bahwa ada banyak perangkat lunak lama yang menganggap bahwa 1 byte = 1 karakter dan tidak dapat bekerja dengan UTF-8.
Masalahnya di Timur adalah lampiran mereka untuk pengkodean seperti GB2312 dan Shift_JIS.
Dan fakta bahwa Microsoft tampaknya masih belum mengerti telah memilih pengkodean UTF yang salah. Jika Anda ingin menggunakan Windows API atau perpustakaan runtime Microsoft C, Anda terbatas pada UTF-16 atau penyandian "ANSI" lokal. Ini membuatnya menyakitkan untuk menggunakan UTF-8 karena Anda harus mengonversi setiap saat.
sumber
Mengapa / Bagaimana kita menggunakan pengkodean Base64?
Base64 adalah salah satu skema pengkodean biner ke teks yang memiliki efisiensi 75%. Ini digunakan agar data biner yang umum (seperti gambar) dapat dengan aman dikirim melalui saluran lama "bukan 8-bit bersih". Dalam jaringan email sebelumnya (hingga awal 1990-an), sebagian besar pesan email berupa teks biasa dalam rangkaian karakter AS-ASCII 7-bit. Begitu banyak standar protokol komunikasi awal yang dirancang untuk bekerja di atas "7-bit" tautan "tidak 8-bit bersih". Efisiensi skema adalah rasio antara jumlah bit dalam input dan jumlah bit dalam output yang dikodekan. Hexadecimal (Base16) juga merupakan salah satu skema pengkodean biner-ke-teks dengan efisiensi 50%.
Langkah-langkah Pengkodean Base64 (Sederhana):
sumber
Kembali pada hari ketika ASCII memerintah dunia berurusan dengan nilai-nilai non-ASCII adalah sakit kepala. Orang-orang melompati segala macam rintangan untuk mendapatkan ini ditransfer melalui kabel tanpa kehilangan informasi.
sumber