Asci 85 - Ascii85

Base85 olarak da adlandırılan Ascii85 , Paul E. Rutter tarafından btoa yardımcı programı için geliştirilmiş bir ikili-metne kodlama biçimidir . Dört baytlık ikili veriyi temsil etmek için beş ASCII karakteri kullanarak (kodlanmış boyutu orijinalden 14 daha büyük yaparak, ASCII karakteri başına sekiz bit varsayılarak), üç baytı temsil etmek için dört karakter kullanan uuencode veya Base64'ten daha verimlidir. veri ( ASCII karakteri başına sekiz bit varsayılarak 13 artış).

Başlıca Modern kullandığı içindedir Adobe 'nin PostScript ve Taşınabilir Belge Biçimi dosya formatları, yanı sıra yama için kodlama ikili dosyaları tarafından kullanılan Git .

genel bakış

İkiliden metne kodlamaya yönelik temel ihtiyaç, yalnızca İngilizce dilinde insan tarafından okunabilir metni taşımak üzere tasarlanmış önceden var olan iletişim protokolleri üzerinden keyfi ikili verileri iletme ihtiyacından gelir . Bu iletişim protokolleri yalnızca 7 bit güvenli olabilir (ve bunun içinde belirli ASCII kontrol kodlarından kaçınır) ve belirli maksimum aralıklarla satır kesmeleri gerektirebilir ve boşluk bırakmayabilir . Bu nedenle, verileri iletmek için yalnızca 94 yazdırılabilir ASCII karakteri "güvenli"dir.

Dört bayt, 2 32  = 4,294,967,296 olası değeri temsil edebilir . Beş taban -85 basamak  , her olası 32 bitlik değer için benzersiz bir temsil sağlamaya yetecek kadar 85 5 = 4.437.053.125 olası değer sağlar. Beş sayı  tabanı -84 basamağı yalnızca 84 5 = 4,182,119,424 temsil edilebilir değer sağladığından , 85, beş karakterde dört baytı temsil edecek olası minimum integral tabandır, bu nedenle seçimdir.

Kodlama sırasında, her 4 baytlık grup, en önemli bayt önce olmak üzere 32 bitlik bir ikili sayı olarak alınır (Ascii85, bir big-endian kuralı kullanır ). Bu, art arda 85'e bölünerek ve kalanı 5 taban-85 basamağa dönüştürülerek dönüştürülür. Daha sonra her bir rakam (yine en önemlisi ilk olarak), kendisine 33 eklenerek ASCII yazdırılabilir bir karakter olarak kodlanır ve ASCII karakterleri 33 (" !") ile 117 (" u") arasında verilir.

Tamamen sıfır veriler oldukça yaygın olduğundan, veri sıkıştırma amacıyla bir istisna yapılır ve tamamı sıfır olan bir grup " z" yerine tek bir karakter " " olarak kodlanır !!!!!.

2 32 − 1'den büyük bir değere (" s8W-!" olarak kodlanmış ) kod çözen zkarakter grupları, bir grubun ortasındaki " " karakterler gibi bir kod çözme hatasına neden olur . Karakterler arasındaki boşluk yok sayılır ve satır uzunluğu sınırlamalarına uyum sağlamak için herhangi bir yerde olabilir.

Ascii85'in bir dezavantajı, kodlanmış verilerin ters eğik çizgi ve alıntı gibi birçok programlama dilinde ve bazı metin tabanlı protokollerde özel anlamı olan kaçış karakterleri içerebilmesidir . Z85 ve RFC 1924 gibi diğer base-85 kodlamaları, kaynak kodunda güvenli olacak şekilde tasarlanmıştır.

Tarih

btoa versiyonu

Orijinal btoa programı her zaman tam grupları (gerektiği şekilde kaynağı doldurarak), "xbtoa Begin" önek satırı ve "xbtoa End" son ek satırı, ardından orijinal dosya uzunluğu (ondalık ve onaltılık olarak ) ve üç 32 ile kodlar. -bit sağlama toplamı . Grubun ne kadarının doldurulduğunu görmek için kod çözücünün dosya uzunluğunu kullanması gerekir. btoa kodlaması için ilk teklif, ASCII boşluk karakterinden "t" dahil olmak üzere başlayan bir kodlama alfabesi kullandı, ancak bu, "!" kodlama alfabesiyle değiştirildi. "u" ile "bazı posta gönderileriyle ilgili sorunlardan (sondaki boşlukları çıkarma)" kaçınmak için. Bu program aynı zamanda ztamamen sıfır grubu için özel " " kısa biçimini de tanıttı . Sürüm 4.2 y, tüm ASCII boşluk karakterlerinden oluşan bir grup (0x20202020) için bir " " istisnası ekledi .

ZMODEM versiyonu

"ZMODEM Pack-7 kodlaması", 4 oktetlik grupları 5 yazdırılabilir ASCII karakterden oluşan gruplara benzer şekilde veya muhtemelen Ascii85 ile aynı şekilde kodlar. Ne zaman Zmodem programları üzerinde önceden sıkıştırılmış 8 bitlik veri dosyaları göndermek 7 bit veri kanallarının , bu "Zmodem Paketi-7 kodlamayı" kullanır.

Adobe sürümü

Adobe, temel btoa kodlamasını benimsedi, ancak küçük değişiklikler yaptı ve ona Ascii85 adını verdi. Kullanılan karakterler , harf (32-bit 0 değerini temsil etmek için özel bir durum olarak) ve beyaz boşluk ile birlikte ( taban-85 basamak 0 ila 84'ü temsil etmek için) dahil olmak üzere 33 ( !) ila 117 ( u) ASCII karakterleridir. zgöz ardı edilir. Adobe, ~>Ascii85 kodlu bir dizenin sonunu işaretlemek için " " sınırlayıcıyı kullanır ve son grubu keserek uzunluğu temsil eder: Kaynak baytların son bloğu 4 bayttan daha az içeriyorsa, blok önce 3 boş bayta kadar doldurulur. kodlama. Kodlamadan sonra, çıktının sonundan dolgu olarak eklenen kadar bayt kaldırılır.

Kod çözme sırasında tersi uygulanır: Son blok Ascii85 karakteriyle 5 bayta doldurulur uve çıktının sonundan doldurma olarak eklenen bayt sayısı atlanır (örneğe bakın).

NOT: Dolgu keyfi değildir. İkiliden taban 64'e dönüştürme yalnızca bitleri yeniden gruplandırır ve onları veya sıralarını değiştirmez (ikili dosyadaki yüksek bit, base64 gösterimindeki düşük bitleri etkilemez). İkili bir sayıyı base85'e dönüştürürken (85, ikinin kuvveti değildir ) yüksek bitler, düşük sıralı base85 basamaklarını etkiler ve bunun tersi de geçerlidir. Kodlama sırasında ikili düşük (sıfır bit ile) doldurma ve ukod çözmede base85 değerini yüksek ( s ile) doldurma, yüksek sıralı bitlerin korunmasını sağlar (ikili dosyadaki sıfır doldurma, küçük bir eklemenin yakalanması için yeterli alan sağlar ve orada yüksek bitlere "taşıma" değildir).

Ascii85 ile kodlanmış bloklarda, boşluk ve satır sonu karakterleri, 5 karakterlik bir bloğun ortası da dahil olmak üzere herhangi bir yerde bulunabilir, ancak bunlar sessizce yok sayılmalıdır.

Adobe'nin spesifikasyonu yistisnayı desteklemez .

Ascii85 için örnek

Thomas Hobbes'un Leviathan'ından bir alıntı :

İnsan, yalnızca aklıyla değil, aynı zamanda, zihnin bir şehveti olan diğer hayvanlardan bu eşsiz tutkuyla ayırt edilir; sürekli ve yorulmak bilmez bir bilgi neslinin verdiği haz, herhangi bir bedensel zevkin kısa şiddetini aşar. .

Bu başlangıçta US-ASCII kullanılarak kodlanmışsa, Ascii85'te aşağıdaki gibi yeniden kodlanabilir:

<~9jqo^BlbD-BleB1DJ+*+F(f,q/0JhKF<GL>Cj@.4Gp$d7F!,L7@<6@)/0JDEF<G%<+EV:2F!,
O<DJ+*.@<*K0@<6L(Df-\0Ec5e;DffZ(EZee.Bl.9pF"AGXBPCsi+DGm>@3BB/F*&OCAfu2/AKY
i(DIb:@FD,*)+C]U=@3BN#EcYf8ATD3s@q?d$AftVqCh[NqF<G:8+EV:.+Cf>-FD5W8ARlolDIa
l(DId<j@<?3r@:F%a+D58'ATD4$Bl@l3De:,-DJs`8ARoFb/0JMK@qB4^F!,R<AKZ&-DfTqBG%G
>uD.RTpAKYo'+CT/5+Cei#DII?(E,9)oF*2M7/c~>
Metin içeriği m a n ... s sen r e
ASCII 77 97 110 32 ... 115 117 114 101
İkili sistem örüntüsü 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0 0 0 1 0 0 0 0 0 ... 0 1 1 1 0 0 1 1 0 1 1 1 0 1 0 1 0 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1
32-bit Değer 1.298.230.816 = 24×85 4 + 73×85 3 + 80×85 2 + 78×85 + 61 ... 1.937.076.837 = 37×85 4 + 9×85 3 + 17×85 2 + 44×85 + 22
Baz 85 (+33) 24 (57) 73 (106) 80 (113) 78 (111) 61 (94) ... 37 (70) 9 (42) 17 (50) 44 (77) 22 (55)
ASCII 9 J Q Ö ^ ... F * 2 m 7

Son 4 demeti eksik olduğundan, üç sıfır bayt ile doldurulmalıdır:

Metin içeriği . \0 \0 \0
ASCII 46 0 0 0
İkili sistem örüntüsü 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
32-bit Değer 771,751,936 = 14×85 4 + 66×85 3 + 56×85 2 + 74×85 + 46
Baz 85 (+33) 14 (47) 66 (99) 56 (89) 74 (107) 46 (79)
ASCII / C Y k Ö

Üç baytlık dolgu eklenmesi gerektiğinden, çıktıdan üç son karakter olan 'YkO' çıkarılmıştır.

Kod çözme işlemi, son 5 demetin 'u' karakterleriyle doldurulması dışında tersten yapılır:

ASCII / C sen sen sen
Baz 85 (+33) 14 (47) 66 (99) 84 (117) 84 (117) 84 (117)
32-bit Değer 771.955.124 = 14×85 4 + 66×85 3 + 84×85 2 + 84×85 + 84
İkili sistem örüntüsü 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 1 1 0 1 0 0
ASCII 46 3 25 180
Metin içeriği . [ ETX ] [ EM ] ´ ( Genişletilmiş ASCII )

Girdinin üç 'u' bayt ile doldurulması gerektiğinden, çıktının son üç baytı yok sayılır ve orijinal nokta ile sonuçlanırız.

Giriş cümlesi 4 ardışık sıfır bayt içermiyor, bu nedenle örnek 'z' kısaltmasının kullanımını göstermez.

uyumluluk

Ascii85 kodlaması, Base64'ten daha az ek yüke sahipken 7-bit ve 8-bit MIME ile uyumludur .

Ascii85'in olası bir uyumluluk sorunu, 'tek' ve "çift" tırnak işaretleri, <açı> köşeli ayraçlar ve ve işaretleri (&) XML veya SGML gibi biçimlendirme dillerinde çıkışsız olarak kullanılamamasıdır.

RFC 1924 sürümü

Yayınlandı 1 Nisan 1996 , bilgilendirme RFC  1924 : "IPv6 Adresleri A Kompakt Temsil" ile Robert Elz bir taban-85 kodlaması da anlaşılacağı IPv6 adresleri. Bu, yukarıda kullanılan şemadan farklıdır, çünkü farklı bir 85 ASCII karakter kümesi önerir ve tüm aritmetiği 128 bitlik sayı üzerinde yapmayı ve onu 20 basamaklı tek bir 85 taban numarasına dönüştürmeyi önerir (dahili boşluklara izin verilmez) , dört 32 bitlik gruba bölmek yerine.

Önerilen karakter seti sırasıyla 09, AZ, azve ardından 23 karakterdir !#$%&()*+-;<=>?@^_`{|}~. Mümkün olan en yüksek temsil edilebilir adres, 2 128 −1 = 74×85 19  + 53×85 18  + 5×85 17  + ..., olarak kodlanacaktır =r54lj&NUUO~Hi%c2ym0.

Bu karakter seti, karakterleri hariç tutar ve JSON dizelerinde (burada ve kaçmanın gerekli olduğu yerlerde) "',./:[\] kullanıma uygun hale getirir . Ancak, için SGML , protokoller tabanlı özellikle de dahil olmak üzere , XML , dize kaçar yine gerekli olabilir (barındırmak için , ve ). "\<>&

Ayrıca bakınız

Referanslar

Dış bağlantılar