Mengapa hanya base64, bukan base128 yang digunakan untuk mengirimkan data biner di web? Kumpulan karakter ASCII memiliki 128 karakter yang secara teori dapat mewakili basis 128, tetapi hanya base64 tetapi tidak base128 yang digunakan dalam banyak kasus.
encoding
language-agnostic
binary
gmadar.dll
sumber
sumber
Jawaban:
Masalahnya adalah bahwa setidaknya 32 karakter dari kumpulan karakter ASCII adalah 'karakter kontrol' yang dapat ditafsirkan oleh terminal penerima. Misalnya, ada karakter BEL (bel) yang membuat terminal penerima berbunyi. Ada karakter SOT (Start Of Transmission) dan EOT (End Of Transmission) yang melakukan persis seperti yang disiratkan oleh namanya. Dan jangan lupa karakter CR dan LF, yang mungkin memiliki arti khusus dalam cara struktur data diserialkan / diratakan menjadi aliran.
Adobe membuat pengkodean Base85 untuk menggunakan lebih banyak karakter dalam kumpulan karakter ASCII, tetapi AFAIK itu dilindungi oleh paten.
sumber
btoa
, yang berasal dari tahun 1990, tidak terbebani oleh paten, dan itu pasti akan kadaluwarsa.Karena beberapa dari 128 karakter tersebut tidak dapat dicetak (terutama yang berada di bawah titik kode 0x20). Oleh karena itu, mereka tidak dapat ditransmisikan dengan andal sebagai string melalui kabel. Dan, jika Anda menggunakan titik kode 128 di atas, Anda dapat mengalami masalah pengkodean karena berbagai pengkodean yang digunakan di seluruh sistem.
sumber
Seperti yang telah dinyatakan dalam jawaban lain, poin kuncinya adalah mengurangi kumpulan karakter menjadi yang dapat dicetak . Skema pengkodean yang lebih efisien adalah basE91 karena menggunakan kumpulan karakter yang lebih besar dan masih menghindari karakter kontrol / spasi dalam rentang ASCII rendah. Halaman web berisi perbandingan yang bagus antara efisiensi pengkodean biner vs. base64 vs. basE91 .
Saya pernah membersihkan implementasi Java. Jika orang tertarik, saya bisa mendorongnya di GitHub.
Pembaruan : Sekarang di GitHub .
sumber
Bahwa 32 karakter pertama adalah karakter kontrol sama sekali tidak ada relevansinya, karena Anda tidak harus menggunakannya untuk mendapatkan 128 karakter. Kami memiliki 256 karakter untuk dipilih, dan hanya 32 karakter pertama yang merupakan karakter kontrol. Itu menyisakan 192 karakter, dan oleh karena itu 128 sepenuhnya mungkin tanpa menggunakan karakter kontrol.
Inilah alasannya: Itu harus sesuatu yang akan terlihat sama, dan Anda dapat menyalin dan menempel, di mana pun. Oleh karena itu harus ada karakter yang akan ditampilkan sama di forum, obrolan, email, dan sebagainya. Itu berarti kami tidak dapat menggunakan karakter, yang biasanya digunakan oleh forum / obrolan / klien email untuk memformat atau mengabaikan. Itu juga harus karakter yang sama, terlepas dari font, bahasa dan pengaturan regional.
Itulah alasannya!
sumber
Base64 biasa terjadi karena memecahkan berbagai masalah (berfungsi hampir di semua tempat yang Anda pikirkan)
Anda tidak perlu khawatir apakah transportasinya bersih 8-bit atau tidak.
Semua karakter dalam pengkodean dapat dicetak. Anda bisa melihatnya . Anda dapat menyalin dan menempelkannya . Anda dapat menggunakannya di URL (varian tertentu). dll.
Memperbaiki ukuran encoding. Anda tahu bahwa
m
byte selalu dapat dienkode menjadin
byte.Semua orang telah mendengarnya - ini didukung secara luas, banyak perpustakaan, sangat mudah untuk dioperasikan.
Base128 tidak memiliki semua keunggulan itu.
Sepertinya 8-bit bersih - tetapi ingat bahwa base64 menggunakan 65 simbol. Tanpa karakter out-of-band Anda tidak dapat memperoleh manfaat dari ukuran encoding tetap. Jika Anda menggunakan karakter out-of-band, Anda tidak bisa menjadi 8-bit clean lagi.
Tidak semuanya negatif.
base128 lebih mudah dienkode / didekode daripada base64 - Anda cukup menggunakan shift dan mask. Dapat menjadi penting untuk implementasi yang disematkan
base128 membuat penggunaan pengangkutan sedikit lebih efisien daripada base64 dengan menggunakan lebih banyak bit yang tersedia.
Orang - orang menggunakan base128 - Saya menggunakannya untuk sesuatu sekarang. Itu tidak biasa.
sumber
CODES
variabel.Tidak yakin, tetapi saya pikir nilai yang lebih rendah (mewakili kode kontrol atau sesuatu) tidak dapat ditransfer secara andal sebagai teks / karakter di dalam HTTP-request / tanggapan, dan nilai di atas 127 mungkin lokal / codepage / apa pun yang spesifik, jadi tidak ada 128 karakter berbeda yang diharapkan dapat bekerja di semua browser / platform.
sumber
esaji benar. Base64 digunakan untuk menyandikan data biner untuk transmisi menggunakan protokol yang hanya mengharapkan teks. Ini tepat di entri Wiki .
sumber
Lihat base128 PHP-Class. Encoding dan decoding dengan charset ISO 8859-1.
GoogleCode PHP-Class Base128
sumber