Mengapa base128 tidak digunakan? [Tutup]

90

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.

gmadar.dll
sumber
60
Mengapa bahkan tidak berbasis 256?
Gumbo
22
Saya pikir intinya adalah memiliki karakter yang dapat dicetak (meskipun ada juga lebih dari 64 ...)
Felix Kling
29
Saya pikir basis 128 menjadi milik kami beberapa waktu lalu. Tim yang ditugaskan untuk menjaga base 64 masih bertahan.
Ritch Melton
5
mengapa pertanyaan ini spesifik tentang javascript? ini juga berlaku untuk sebagian besar bahasa lain yang digunakan di web, bukan?
Benedikt Waldvogel
5
@KenRockot: Saya melihat Anda mengenali bahwa beberapa karakter 15-bit Anda akan dikodekan menjadi 3 byte. Enkode base-2048 Anda berarti mengemas 11 bit menjadi 2 byte, yang menghasilkan 5,5 bit per byte - setengahnya kurang dari basis 64.
maaartinus

Jawaban:

105

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.

pepoluan
sumber
7
Base91 sepertinya pilihan open source yang bagus: base91.sourceforge.net
Jorge Cevallos
2
Perlu dipertimbangkan bahwa kekuatan 2 lebih mudah menyesuaikan data byte, dan pengkodean lebih sederhana. Lalu ada portabilitas; setiap bahasa memiliki encode base64 dan / atau decode base64.
Lodewijk
5
Re Base85 dan Adobe : jawabannya dapat dibuat lebih berguna jika mengutip nomor paten dan tahun yang diberikan. Jika paten adalah masalah selalu ada btoa, yang berasal dari tahun 1990, tidak terbebani oleh paten, dan itu pasti akan kadaluwarsa.
agc
65

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.

driis
sumber
8
Base94 ada di sini di github, ia menggunakan 94 karakter ASCII yang dapat dicetak: gist.github.com/iso2022jp/4054241
intrepidis
15

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 .

Benedikt Waldvogel
sumber
Saya akan tertarik dengan versi java
Michael Deardeuff
2
Dorong ke: github.com/bwaldvogel/base91
Benedikt Waldvogel
12

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!

pengguna3119289
sumber
7
Karakter kontrol relevan karena hampir semua orang sudah mengasumsikan maksud Anda bahwa itu harus halaman kode / pengkodean netral mungkin. Itu tentu membatasi Anda hanya pada ASCII (7-bit) yang merupakan bagian dari sebagian besar pengkodean yang relevan. Juga tidak semua internet 8-bit bersih, dan sebagian besar adalah defacto ASCII. Poin Anda layak untuk dibuat.
Tim Seguine
7
Sekadar menambahkan: ASCII hanya mendefinisikan 128 karakter. Karakter # 128 sampai # 255 tidak ditentukan dalam ASCII. Karena pertanyaan merujuk ASCII secara eksplisit dan bukan "pengkodean 8-bit apa pun", semua jawaban membatasi diri pada 128 karakter kumpulan ASCII.
pepoluan
Menggunakan encoding UTF-8 yang paling umum sebagai contoh: Byte pada 128 hingga 196 akan langsung menghasilkan kesalahan decoding UTF8; byte pada 196 hingga 256 akan menyiratkan bahwa byte berikutnya juga memiliki karakter yang sama, tetapi jika byte berikutnya di bawah 128, itu akan menghasilkan kesalahan decoding UTF8 lagi. Namun, hampir semua bahasa yang peka pengkodean karakter akan meminta pustaka base64 menggunakan string base64 sebagai string yang aman untuk UTF8. Hal yang sama tidak dapat dilakukan dengan base128 karena tidak dapat dienkode sebagai string aman UTF8.
SOFe
10

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 mbyte selalu dapat dienkode menjadi nbyte.

  • 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.

John La Rooy
sumber
Juga ingat bahwa sistem surat / berita dan sejenisnya (dan juga XML) tidak selalu baik untuk 32 titik kode pertama (pertimbangkan CR LF vs LF, misalnya), tetapi sebaliknya jawaban Anda terlihat sangat bagus.
SamB
"base64 itu menggunakan 65 simbol." => salah ketik atau apakah saya melewatkan sesuatu?
Kikiwa
@Kikiwa, lihat contoh java ini di wikipedia . Periksa panjang CODESvariabel.
John La Rooy
Oh ya, karakter padding '=' hanya di akhir payload encoding, Anda benar, terima kasih.
Kikiwa
4

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.

esaj
sumber
3

esaji benar. Base64 digunakan untuk menyandikan data biner untuk transmisi menggunakan protokol yang hanya mengharapkan teks. Ini tepat di entri Wiki .

Russell Troywest
sumber
2

Lihat base128 PHP-Class. Encoding dan decoding dengan charset ISO 8859-1.

GoogleCode PHP-Class Base128

seizu
sumber
1
saya berharap itu menggunakan utf-8 sebagai gantinya ...
Janus Troelsen
1
Pengkodean dasar tidak ada hubungannya dengan data yang mendasarinya. Anda dapat menggunakan pengkodean teks apa pun yang Anda inginkan untuk menyandikan teks / data Anda. Yang dia maksud adalah tabel indeks Base ## menggunakan charset ISO 8859-1 ASCII sebagai terjemahannya.
Chad
1
Itu ada hubungannya dengan data yang mendasarinya segera setelah Anda mencoba menyematkan data biner yang dikodekan dasar dalam teks. Jika teks itu dikodekan dalam pengkodean lain, Anda akan mengalami masalah.
Stijn de Witt
Tidak ada yang namanya kumpulan karakter "ISO 8859-1 ASCII". Program ini mengkodekan data menggunakan 128 karakter ISO 8859-1 yang dapat dicetak. Itu tidak menggunakan ASCII , dengan cara, bentuk atau bentuk apapun.
Nisse Engström