Кіріспе

Ascii85 (Base85 деп те аталады) – Пол Э. Рутер btoa утилитасы үшін әзірлеген екілік кодты мәтінге түрлендірудің бір түрі. Бес ASCII символын төрт байт екілік деректерді көрсету үшін пайдалану (ASCII символына сегіз биттен деп есептегенде, кодталған көлем түпнұсқадан үлкен болады), бұл uuencode немесе Base64-тен тиімдірек, олар үш байт деректерді көрсету үшін төрт символ қолданады (көбейту, ASCII символына сегіз биттен деп есептегенде). Оның қазіргі замандағы негізгі қолданылуы Adobe PostScript және Portable Document Format файл форматтарында, сондай-ақ Git қолданатын екілік файлдарға арналған түзету кодтауында.

Шолу

Бинарлық мәтінге кодтаудың негізгі қажеттілігі, тек ағылшын тіліндегі адам оқи алатын мәтінді тасымалдауға арналған, бұрыннан бар байланыс протоколдары арқылы кез келген бинарлық деректерді жеткізу қажеттілігінен туындайды. Бұл байланыс протоколдары тек 7 биттік қауіпсіз болуы мүмкін (соның ішінде, белгілі бір ASCII басқару кодтарынан аулақ болу керек), белгілі бір максималды интервалдарда жол үзілістерін қажет етуі мүмкін, және бос орындарды сақтамауы мүмкін. Осылайша, деректерді жеткізу үшін тек 94 басылатын ASCII символы "қауіпсіз". 85 – n5 ≥ 2564 шартын қанағаттандыратын n-нің ең кіші бүтін саны; демек, кез келген 4 байттық тізбекті 5 символмен кодтауға болады, егер кем дегенде 85 түрлі символ қол жетімді болса. (Бес 85-тік санау жүйесінің цифры 0-ден 4,437,053,124-ке дейінгі бүтін сандарды көрсетуге мүмкіндік береді, бұл барлық 4,294,967,296 мүмкін 4 байттық тізбекті көрсету үшін жеткілікті.)

Кодтау

Кодтау кезінде 4 байттың әр тобы 32 биттік екілік сан ретінде қабылданады, ең маңызды байт бірінші (Ascii85 үлкен эндиандық конвенцияны қолданады). Бұл сан 85-ке қайталап бөлініп, қалдықтары арқылы 5-ке 85-тік санға айналдырылады. Содан кейін әрбір сан (қайтадан да, ең маңыздысы бірінші) 33-ті қосу арқылы ASCII басылатын таңбасы ретінде кодталады, нәтижесінде ASCII таңбалары 33 (!) мен 117 (u) аралығында шығады. Барлық нөлдік деректер жиі кездесетіндіктен, деректерді қысу үшін ерекшелік жасалады, сондықтан барлық нөлдік топ бір z таңбасымен кодталады, ! !!!! орнына. 232 − 1 мәнінен асатын мәнді декодтауға болатын таңбалар тобы (мысалы, s8W ! ретінде кодталған) декодтау қатесіне себеп болады, сондай-ақ топтың ортасындағы z таңбалары да қате тудырады. Таңбалар арасындағы бос орын назарға алынбайды және жол ұзындығының шектеулеріне сәйкес кез келген жерде болуы мүмкін.

Шектеулер

Бастапқы спецификацияда тек 4 байтқа бөлінетін ағынды кодтауға рұқсат етіледі. Кодталған деректерде көптеген бағдарламалау тілдерінде және кейбір мәтіндік протоколдарда, мысалы, сол жақ бұрышты жақша <, кері қисық сызық \, және бір және екі тырнақша ' және " сияқты арнайы мағынасы бар символдар кездесуі мүмкін. Z85 сияқты басқа 85-тік кодтаулар бастапқы кодта қауіпсіз болу үшін жасалған.

btoа нұсқасы

Бастапқы btoa бағдарламасы әрқашан толық топтарды кодтады (қажет болған жағдайда бастапқы деректерді толтыру арқылы), "xbtoa Begin" префиксі және "xbtoa End" суффиксі жолдарымен, содан кейін бастапқы файлдың ұзындығы (ондық және он алтылық санау жүйесінде) және үш 32 биттік бақылау сомасы қосылды. Декодерге топтың қанша бөлігі толтыру екенін анықтау үшін файл ұзындығын пайдалану қажет. btoa кодтамасының алғашқы ұсынысында ASCII кеңістігінен бастап "t" әрпіне дейінгі кодтау алфавиті қолданылған, бірақ кейін ол "!" және "u" әрпінен тұратын алфавитке ауыстырылды, бұл кейбір пошта бағдарламаларында (соңғы бос орындарды жою) туындайтын мәселелерді болдырмау үшін жасалды. Бұл бағдарламада барлық нөлдерден тұратын топ үшін арнайы "z" қысқартылған белгісі де енгізілді. 4.2 нұсқасы ASCII бос орын таңбаларынан (0x20202020) тұратын топ үшін "y" ерекшелігін қосты.

ZMODEM нұсқасы

"ZMODEM Pack 7 encoding" 4 октеттен тұратын топтарды, Ascii85 сияқты немесе мүмкін сондай-ақ, 5 баспаға жарамды ASCII таңбасынан тұратын топтарға түрлендіреді. ZMODEM бағдарламасы 7 биттік дерек арналары арқылы алдын ала сығылған 8 биттік дерек файлдарын жібергенде, "ZMODEM Pack 7 encoding" қолданылады.

Adobe нұсқасы

Adobe негізгі btoa кодтамасын қабылдады, бірақ шағын өзгерістермен, және оған Ascii85 деген атау берді. Қолданылатын таңбалар ASCII таңбалары 33 (!) мен 117 (u) аралығындағы (85-тік санау жүйесіндегі 0-ден 84-ке дейінгі сандарды көрсету үшін), сондай-ақ z әрпі (32-биттік 0 мәнін көрсету үшін ерекше жағдай ретінде) және бос орын ескерілмейді. Adobe Ascii85 кодталған жолдың соңындағы "~>" айырғышын пайдаланады және соңғы топты қысқарту арқылы ұзындығын көрсетеді: егер бастапқы байттардың соңғы тобында 4 байттан кем болса, кодтау алдында топ 3 нөлдік байтқа дейін толтырылады. Кодтаудан кейін, толтыру ретінде қосылған байттар нәтиженің соңынан алынып тасталады. Декодтау кезінде керісінше орындалады: соңғы топ Ascii85 u таңбасымен 5 байтқа дейін толтырылады, ал толтыру ретінде қосылған байттар нәтиженің соңынан алынып тасталады (мысалға қараңыз). Бұл толтыру кездейсоқ емес. Бинарлықтан 64-тік санау жүйесіне түрлендіру тек биттерді қайта топтостырады және оларды немесе олардың ретін өзгертпейді (бинарлық биттің жоғары биті 64-тік санау жүйесіндегі төмен биттерге әсер етпейді). Бинарлық санды 85-тік санау жүйесіне түрлендіруде (85 екінің дәрежесі емес) жоғары биттер төменгі разрядтағы 85-тік санау жүйесінің сандарына әсер етеді және керісінше. Бинарлық кодты төмен (нөлдік биттермен) толтыру және 85-тік санау жүйесінің мәнін жоғары (u әрпімен) толтыру арқылы декодтау жоғары разрядтағы биттердің сақталуын қамтамасыз етеді (бинарлық кодтағы нөлдік толтыру кішкентай қосымшаны ұстап тұрып, жоғары биттерге "тасымалдаудың" болмауын қамтамасыз етеді). Ascii85 кодталған блоктарында бос орын және жолдың жаңару таңбалары кез келген жерде, тіпті 5 таңбалық блоктың ортасында да болуы мүмкін, бірақ олар үнсіздікпен елемеуге тиіс. Adobe-ның спецификациясы y ерекшелігін қолдамайды.

Бір-біріне үйлесімділік

Ascii85 кодтамасы 7 биттік және 8 биттік MIME форматымен үйлесімді, сонымен қатар Base64-ке қарағанда аз қосымша жүктемеге ие. Ascii85-тің мүмкін болатын үйлесімсіздік мәселесі – оның пайдаланатын кейбір таңбалары XML немесе SGML сияқты таңбалау тілдерінде маңызды болып табылады. Осы құжаттарға Ascii85 деректерін қосу үшін тырнақшаларды, бұрыштық жақшаларды және амперсандтарды кодтау қажет болуы мүмкін.

RFC 1924 нұсқасы

1996 жылғы 1 сәуірде жарияланған, ақпараттық хабарлама: Роберт Эльцтің "IPv6 мекенжайларының ықшам бейнесі" еңбегі IPv6 мекенжайларын 85-тік санау жүйесінде кодтауды ұсынады. Бұл жоғарыда қолданылған схемадан айырмашылығы, ол 85 ASCII символының басқа жиынтығын ұсынады және 128 биттік санды 32 биттен тұратын төрт топқа бөлудің орнына, оның барлық арифметикалық амалдарын орындап, оны бір 20 таңбалық 85-тік санға (ішкі бос орындарға рұқсат етілмейді) түрлендіруді ұсынады. Ұсынылған символдар жиынтығы: 0–9, A–Z, a–z, және содан кейін 23 символ – !#$%& *+ ;<=>? @^ `{|}~. Ең жоғары бейнелене алатын мекенжай, 2128−1 = 74×8519 + 53×8518 + 5×8517 + , =r54lj&NUUO~Hi%c2ym0 түрінде кодталады. Бұл символдар жиынтығы "',./:[\] символдарынан тұрмайды, бұл оны JSON жолдарында пайдалануға ыңғайлы етеді (мұнда " және \ символдарына қашу таңбалары қажет). Дегенмен, SGML негізіндегі протоколдар үшін, атап айтқанда XML үшін, жолдарды қашу таңбаларымен белгілеу әлі де қажет болуы мүмкін (<, > және & символдарына орын беру үшін).