Base91 Kodlama / Çözme

basE91 ile metin veya ikili baytları dönüştürün: iki yazdırılabilir karakter başına 13 bit girdi, bu da onu günlük yazdırılabilir kodlamalar arasında en yoğun yapar — Base64'ün %33 ek yüküne karşı yaklaşık %23. Metin UTF-8 baytları olarak işlenir; ikili veriler için onaltılık bayt modu vardır. Ayrıca: Base64 | Base32 / Base58 | Ascii85.
Tüm işlemler tarayıcınızda yerel olarak gerçekleşir — verileriniz hiçbir sunucuya yüklenmez.

Base91'i hiç duymadınız mı? Base91 nedir — sade bir dille açıklanmış (çalışılmış bir örnek, alfabe ve tuzaklarla).
Nasıl çalışır: Girdi baytlara çevrilir, ardından her biri iki karaktere dönüşen 13 bitlik gruplara paketlenir; kısa biçimin belirsiz olduğu her yerde ise bir 14 bitlik grup kullanılır.
Girdi:
Nasıl çalışır: Boşluklar yok sayılır ve her karakter bu sayfanın aşağısında yazdırılan alfabeye göre aranır. Bilinmeyen bir karakter konumuyla bildirilir.
Çıktı biçimi:
Girdide Ctrl+Enter etkin modu çalıştırır.
Kodla veya Çöz seçeneğini seçin ve işlem düğmesine tıklayın. Kendi kendine test 130 kodlama/çözme gidiş-dönüşü çalıştırır ve sayısını burada bildirir.
Alfabe, tamamı yazdırılmış: Base91'in arkasında bir standart kuruluş yoktur, bu yüzden alfabe uygulamalar arasında garanti edilmez. Bu sayfa referans uygulamanın alfabesini kullanır ve aşağıdaki her değer tam olarak tabloda listelenen 91 karakterle üretilmiştir.
Yeşil hücreler HTML metninde veya bir URL sorgusunda güvenle durabilen karakterlerdir; turuncular escape edilmeli veya yüzde kodlanmalıdır (tablonun altındaki notlara bakın).
Yeşil hücreler HTML metninde veya bir URL sorgusunda güvenle durabilen karakterlerdir; turuncular escape edilmeli veya yüzde kodlanmalıdır (tablonun altındaki notlara bakın).
Aynı 92 baytlık girdide ölçülen boyutlar:
Burada dizgi üzerinde ölçülen karakter sayıları. Base91 kazanır, çünkü 912 = 8281, 13 bitin 8192 değerini kapsar; Base64 ise yalnızca 24 bit için 4 karakter harcar.
Base91 nedir?

Base91, Base64'ün yaptığı işi, yani rastgele baytları yalnızca yazdırılabilir ASCII karakterleriyle yazmayı yapar, ama her karaktere daha fazla bit sığdırır. Girdiyi 6 bitlik gruplara bölüp her grup için bir karakter yazdırmak yerine, en az 13 bit toplanana kadar bit biriktirir ve sonra bu 13 (veya 14) bitin değerini birlikte adlandıran iki karakter yazdırır.

91 karakterlik bir alfabeden iki karakter 91 × 91 = 8281 farklı değer adlandırabilir ve 213 = 8192 olduğundan, iki karakter her zaman 13 bit için yer bulur — 89 değer boşta kalır. Hile budur: iki karakter başına 13 bit, karakter başına 6,5 bit demektir; Base64'ün 6'sına karşı ve ek yük %33 yerine yaklaşık %23'tür.

30 saniyelik sürüm: test fPNKd olur ve Hello, World! >OwJh>}AQ;r@@Y?F olur. Çözme tam tersidir ve aynı 91 karakterlik alfabeyi gerektirir — farklı bir alfabe aynı bayttan farklı çıktı verir.
13 ve 14 bit nereden geliyor

91 × 91 = 8281 değer bir karakter çiftiyle adlandırılabilir; bu 213 = 8192'den fazla ama 214 = 16384'ten azdır. Yani bir karakter çifti her zaman 13 bit, bazen de 14 bit taşıyabilir. Kodlayıcı önce 13 biti dener: 13 bitlik değer 88'den büyükse bu değeri iki karakter olarak yazdırır; değilse 14. biti alır ve ortaya çıkan 14 bitlik değeri yazdırır.

88 sınırı keyfi değildir. İki karakterin adlandırabileceği en büyük değer 90 + 91 × 90 = 8280'dir ve 8192 + 89 = 8281 zaten bunun ötesindedir. Yani hiçbir 14 bitlik grubun 89 veya daha büyük bir düşük 13 bit penceresi olamaz; bu da kodçözücünün iki durumu yalnızca değerin kendisine bakarak ayırt edebileceği anlamına gelir:

Çözücünün gördüğüTükettiği bitlerNeden
değer & 8191, 89 ila 8191 arasında13 bit89 ve üzeri değerler yalnızca 13 bitlik daldan gelebilir, çünkü bu kadar yüksek bir düşük 13 bit penceresine sahip 14 bitlik bir grup en az 8281 olmak zorunda olurdu — ki bunu hiçbir karakter çifti adlandıramaz.
değer & 8191, 0 ila 88 arasında14 bitKodlayıcı yalnızca 13 bitlik okuma 88 veya daha az olduğunda 14 bite döner, bu yüzden bu dal yedektir ve başka hiçbir şey değildir.

Sonda kalan her şey — 1 ila 13 bit arası herhangi bir şey — tek bir karakter olarak yazdırılır, kalan 7 bitten fazla gerekiyorsa ikinci bir karakter eklenir. Kodlanmış uzunluk bu yüzden iki karakterlik adımlarla büyür ve bazen tek sayıda biter.

Alfabe ve düşürdüğü üç karakter

Yazdırılabilir ASCII, ! (0x21) ile ~ (0x7E) arasında 94 karakter içerir. Base91 bunların 91'ini kullanır ve dışarıda bıraktığı üçü şunlardır: kısa çizgi -, kesme işareti ' ve ters eğik çizgi \. Harfler, rakamlar ve neredeyse tüm noktalama işaretleri, yukarıdaki tabloda gösterilen sırayla alfabede tam olarak bir kez bulunur; 92. ila 94. yazdırılabilir karakterlere ise hiç erişilemez.

Alfabe sabit bir sıra olduğu için bir değerin karakteri bir formül değil, bir aramadır. Alfabeyi farklı sıralayan iki uygulama ikisi de "Base91" olur ve birbirlerinin çıktısını okuyamaz; bu, kafa karıştırıcı sonuçların tek en yaygın kaynağıdır. Bu sayfa alfabesini yazdırır, böylece çıktı her zaman ona geri izlenebilir.

Base91, diğer yazdırılabilir kodlamalar yanında
KodlamaKarakter başına bitGirdiye göre boyutNotlar
Base16 (hex)4%200Bayt başına iki karakter, tamamen okunabilir, aranacak bir alfabe yok.
Base325%160Büyük-küçük harf duyarsız ve elle diktelenmeye güvenli, ama grubun en israfçısı.
Base58~5,86~%137Yoğunluk için değil adresler için seçildi: benzer görünen karakterlerden kaçınır.
Base646%133Her yerde varsayılan: 3 bayt başına 4 karakter; son karakterin kullanılmayan 6 biti boşa gider.
Ascii85 / Base856,4%1254 bayt başına 5 karakter, arama tablosu gerekmez, ama 85'e böler — bkz. Ascii85 dönüştürücü.
Base91~6,5~%123Bunların en yoğunu: iki karakter başına 13 bit, burada ve orada bir 14 bitlik grup pahasına.

Yüzdeler, her kodlamanın asimptotik maliyetinin yuvarlanmış hâlidir; gerçek bir 92 baytlık girdi için ölçülen karakter sayıları bu sayfanın yukarısındaki tabloda yer alır. Base91, yazdırılabilir ASCII ile herhangi bir kodlamanın yapabileceğinin en iyisine yakındır: karakter başına 7 bit, 128 ayrı karakter kullanmak demek olurdu ve yazdırılabilir aralık bunu sağlayamaz.

Base91 olmayan şey
  • Standart değil. RFC yok. Referans uygulama, Joachim Henke tarafından BSD 3 madde lisansıyla yayımlanan basE91 0.6.0'dır; "Base91" bu alfabe olmayan alfabeler için de kullanılır.
  • Şifreleme değil. Her karakter girdi bitlerinin düz bir yeniden şekillendirmesidir ve alfabeyi bilen herkes tek geçişte tersine çevirebilir.
  • URL-güvenli değil. Alfabe #, %, &, /, ? ve " içerir; bunların hepsi bir URL'de anlam değiştirir, bu yüzden Base91 çıktısı bir sorgu dizgisine girmeden önce yüzde kodlanmalıdır.
  • HTML-güvenli değil. <, >, & ve " de içerir, bu yüzden bir işaretlemeye yerleştirilen bir Base91 dizgisi HTML varlık dönüştürücüyle escape edilmelidir.
  • Sabit uzunlukta değil. Çıktı uzunluğu yalnızca bayt sayısına değil bit desenine bağlıdır, bu yüzden aynı boyuttaki iki girdi bir karakter farklı yazdırılabilir.
Gerçekten ısıran tuzaklar
  • Bu sayfadaki alfabe referans alfabedir. Başka bir araç aynı girdi için farklı çıktı üretiyorsa, herhangi bir tarafın bozuk olduğunu varsaymadan önce alfabesini karşılaştırın. 91 karakter aynı sırada görünmelidir.
  • Tek bir yanlış karakter tüm kuyruğu değiştirebilir. Grup sınırları önceki değerlerle belirlenir; bu yüzden dizgideki erken bir düzenleme sonrasındaki her şeyi kaydırır ve kuyruk yalnızca son grubun kalan bitleriyle çözülür.
  • Tek sayıda çıktı uzunluğu normaldir. Dizgi kesilmiş anlamına gelmez; son grup, kalan değeri 7 bit veya daha az sığdığında bir karakter yazdırır.
  • Yayımlanmış bir örnek, yazmadığınız bir satır sonu içerebilir. Satır sonu ekleyen bir kabuk komutu, bilinen bir Base91 değerinin burada aynı metnin ürettiğinden bir karakter uzun olmasının olağan nedenidir: echo "Hello, World!" kodlayıcıya 14 bayt verir ve >OwJh>}AQ;r@@Y?FF yazdırır, oysa yalnızca metnin 13 baytı >OwJh>}AQ;r@@Y?F yazdırır. İkisi de farklı bayt sayıları için doğrudur ve çıktı kutusunun altındaki sayı hangisini tuttuğunuzu söyler.
  • İkili veriyi metin olarak çözmek çalışmaz. Çözülen baytlar geçerli UTF-8 değilse gösterilecek anlamlı bir metin yoktur; onaltılık çıktı modu tam da bunun içindir.
Hızlı yanıtlar

“Bu sayfa neden başka bir Base91 aracından bir karakter farklı bir değer gösteriyor?”

Neredeyse her zaman farklı bir alfabe. İkinci en yaygın neden, 14 bitlik yedek yolu hiç kullanmayan, yalnızca 13 bitlik dalı kullanan bir araçtır; bu varyant kodda daha küçüktür ama burada kullanılan referans algoritmadan farklı çıktı üretir.

Bayt sayarak çözülebilecek tek bir kesin durum daha var ve en yaygın alıntılanan örneği açıklar: sondaki satır sonu. Yayımlanan vektörlerin çoğu bir kabuk komutuyla üretildi ve kabuk satırı bitiren satır sonunu ekler. Hello, World! metninin 13 baytı burada 16 karakter yazdırır, oysa Hello, World! ve ardından bir satır sonunun 14 baytı 17 karakterlik >OwJh>}AQ;r@@Y?FF'yi yazdırır. Değerlerden birini Çöz'e yapıştırın: bu sayfa bayt sayısını bildirir, böylece iki okuma tartışılmadan ayırt edilebilir. Örnek düğmesi, kullandığınız okuyucuya ait olanı yükler ve Kodla / Çöz anahtarını ve Girdi / Çıktı biçimi seçicisini izler: metin okuyucusu 16 karakterlik değeri alır, onaltılık okuyucu ise sondaki 0A baytı açıkça görünen 17 karakterlik değeri alır ve kodlayıcı bir Base91 dizgisi yerine kodlanacak metni alır.

“Base91, Base64'ten daha küçük mü?”

Evet, kodlanmış boyutun yaklaşık %8'i kadar: karakter başına 6 bit yerine iki karakter başına 13 bit. 92 bayt metinde Base64 124 karakter yazdırır, Base91 ise 114.

“Bunu bir Base64 kod çözücüyle çözebilir miyim, ya da tersi?”

Hayır. Alfabeler harflerde ve rakamlarda örtüşür, bu yüzden bir Base64 kod çözücü bir Base91 dizgisini "geçerli" karakterler olarak kabul eder ve sessiz bir anlamsızlık üretir. İkisi şemanın biçimi dışında hiçbir konuda anlaşmaz.

“Çıktı Base64 gibi dolguyla mı biter?”

Hayır. Base91'in hiç dolgu karakteri yoktur: sondaki kalan bitler son grup olarak yazdırılır, bu yüzden hiçbir şey eklenmez veya kaldırılmaz.

“Bu sayfadaki sonucun doğru olduğunu nasıl bilebilirim?”

Kendi kendine test 0 ila 64 bayt'a basın. 13 ve 14 bitlik bölünmenin değiştiği her uzunluğu kapsayan 130 bayt deseni kodlar ve çözer ve geri gelen baytları giden baytlarla karşılaştırır. Örnek düğmesinin vektörleri ayrıca bu sitenin test araçlarında tutulan ikinci bir uygulamayla çapraz denetlenir.

Standartlar ve atıf

Bu sayfa, Joachim Henke'nin BSD 3 madde lisansıyla dağıtılan basE91 referans uygulamasının (sürüm 0.6.0) algoritmasını, yukarıda yazdırılan alfabeyle uygular. Çözme, referans araç gibi boşlukları kabul eder ve yok sayar.

Bu sitenin metni bu site için yazılmıştır; algoritma hiçbir yerden kopyalanmadı. Örnek düğmesinin değerleri, referans paketle gelen tek örnektir ("reference example" olarak işaretlenmiş) ve bu sitenin test araçlarında tutulan ikinci, bağımsız bir uygulamanın ürettiği değerlerdir ("cross-check" olarak işaretlenmiş).