Кіріспе

Компьютерлік деректерді мәтінге түрлендіру – екілікті мәтінге кодтау, деректерді қарапайым мәтін түрінде кодтау. Нақтырақ айтқанда, бұл екілік деректерді басып шығаруға болатын символдар тізбегімен кодтау. Бұл кодтаулар деректерді беру үшін қажет, егер байланыс арнасы екілік деректерді қабылдамаса (мысалы, электрондық пошта немесе NNTP) немесе 8 биттік таза болмаса. PGP құжаттамасында Base64 туралы айтылғанда, екілікті мәтінге кодтау үшін "ASCII бронясы" термині қолданылады.

Шолу

Бинарлық мәліметтерді мәтінге кодтау қажеттілігі, негізінен, тек ағылшын тіліндегі адам оқи алатын мәтінді тасымалдауға арналған, бұрыннан бар байланыс протоколдары арқылы кез келген бинарлық деректерді жеткізу қажеттілігінен туындайды. Бұл байланыс протоколдары тек 7 биттік қауіпсіздікті қамтамасыз етуі мүмкін (соның ішінде, кейбір ASCII басқару кодтарынан сақтану керек), белгілі бір максималды интервалдарда жол үзілістерін қажет етуі мүмкін, және бос кеңістікті сақтамауы мүмкін. Осылайша, деректерді жеткізу үшін тек 94 басылатын ASCII символы "қауіпсіз" болып саналады.

Сипаттама

ASCII мәтін кодтау стандарты таңбаларды кодтау үшін 7 битті пайдаланады. Осы арқылы 128 (яғни 27) бірегей мәнді (0–127) ағылшын тілінде жиі қолданылатын әліпбилік, сандық және тыныш белгілерді көрсету үшін, сондай-ақ баспаға шығарылмайтын бақылау таңбаларын таңдау үшін кодтауға болады. Мысалы, үлкен әріп А 7 битте 100 00012, 0x41 (1018) ретінде көрсетіледі, сан 2 – 011 00102 0x32 (628), } таңбасы – 111 11012 0x7D (1758), ал бақылау таңбасы RETURN – 000 11012 0x0D (158) болып табылады. Керісінше, көптеген компьютерлер деректерді 8 биттік байттармен ұйымдастырылған жадта сақтайды. Машиналық орындалатын кодты және мәтіндік емес деректерді қамтитын файлдар әдетте 256 мүмкін 8 биттік байт мәнінің барлығын қамтиды. Көптеген компьютерлік бағдарламалар 7 биттік мәтін мен 8 биттік екілік деректер арасындағы осы айырмашылыққа тәуелді болып келді және егер ASCII емес таңбалар тек ASCII мәтінін қамтиды деп күтілетін деректе пайда болса, дұрыс жұмыс істемейді. Мысалы, егер сегізінші биттің мәні сақталмаса, бағдарлама 127-ден жоғары байт мәнін қандай да бір функцияны орындау туралы нұсқау ретінде қабылдауы мүмкін. Дегенмен, мәтінге негізделген жүйелер арқылы мәтіндік емес деректерді жіберу жиі қажет болады, мысалы, электрондық поштаға бейне файлды тіркеу. Осы мақсатта деректер белгілі бір тәсілмен кодталады, яғни 8 биттік деректер 7 биттік ASCII таңбаларына айналдырылады (әдетте әріптік-сандық және тыныш белгілер – ASCII басып шығаратын таңбалар ғана қолданылады). Деректер қауіпсіз түрде түскеннен кейін, олар қайтадан 8 биттік түріне декодталады. Бұл процесс екілікті мәтінге кодтау деп аталады. Көптеген бағдарламалар деректерді тасымалдауға мүмкіндік беру үшін осы түрлендіруді жүзеге асырады, мысалы, PGP және GNU Privacy Guard.

Қарапайым мәтінді кодтау

Бинарлық мәтінге кодтау әдістері жай мәтінді кодтау механизмі ретінде де қолданылады. Мысалы:
Кейбір жүйелерде олар қолдай алатын таңбалар жинағы шектеулі; олар 8 биттік таза емес, тіпті кейбіреулері барлық басылатын ASCII таңбаларын өңдей алмайды. Басқа жүйелерде жол үзілістері арасындағы таңбалар санына шектеулер қойылады, мысалы, кейбір Simple Mail Transfer Protocol бағдарламалық қамтамасының "бір жолға 1000 таңба" лимиті. Ал кейбіреулері мәтінге шабыттар немесе қосымша ақпараттар қосады. Нақты үлгілер хабарламада пайда болған жағдайда шатасу тудыратын, жолақты сигналдауды қолданатын, нашар саналатын бірақ әлі де қолданылып жүрген протоколдар бар. Ең танымал мысал – mbox файл форматындағы электрондық пошта хабарламаларын бөлу үшін жол басында қолданылатын "From " жолы (соңындағы бос орынды қоса). Екілік мәтінге кодтауды қолданып, бастапқыда жай мәтін болған хабарламаларды, содан кейін екінші жағынан декодтау арқылы мұндай жүйелерді толыққанды ашық көрінуге жасауға болады. Бұл кейде "ASCII бронясы" деп аталады. Мысалы, ASP.NET-тің ViewState компоненті, шекаралық қақтығыстарды болдырмау үшін мәтінді HTTP POST арқылы қауіпсіз жеткізу үшін base64 кодтауын пайдаланады.

Кодтау стандарттары

Төмендегі кестеде мәтіндік кодтамалар үшін екілік кодтаманың ең көп қолданылатын түрлері салыстырылады. Көрсетілген тиімділік – кірістегі биттер саны мен кодталған шығыстағы биттер саны арасындағы қатынас. Кодтау Деректер түрі Тиімділік Бағдарламалау тілінің іске асырылуы Ескертулер Ascii85 Кез келген 80% awk, C, C(2), C#, F#, Go, Java, Perl, Python, Python(2) Бұл кодтаудың бірнеше түрі бар: Base85, btoa және т.б. Base32 Кез келген 62.5% ANSI C, Delphi, Go, Java, C#, F#, Python Base36 Бұлың сан ~64% bash, C, C++, C#, Java, Perl, PHP, Python, Visual Basic, Swift, тағы да көптеген араб сандары 0–9 және латын әріптері A–Z (ISO негізгі латын әліпбиі) қолданылады. TinyURL немесе SnipURL/Snipr сияқты URL қайта бағыттау жүйелерінде ықшам әріптік-сандық идентификаторлар ретінде жиі қолданылады. Base45 Кез келген ~67% (97%) Go, Python IETF Specification RFC 9285 екілік деректерді QR-кодқа ықшам түрде енгізу үшін анықталған. Base56 Бұлың сан — PHP, Python, Go Base58 кодтамасының нұсқасы, алдамшылық пен адам қателіктерінің тәуекелін азайту үшін '1' және кіші әріпті 'o' таңбаларын жояды. Base58 Бұлың сан ~73% C, C++, Python, C#, Java Base64-ке ұқсас, бірақ алфавиттік емес таңбаларды (+ және /) және басып шығарғанда шатастыруға болатын әріптерді (0 нөл, I үлкен i, O үлкен o және l кіші l) болдырмау үшін өзгертілген. Base58 биткоин мекенжайларын көрсетуге қолданылады. Кейбір хабарламалар мен әлеуметтік желілер алфавиттік емес тізбектерде жолдарды бөледі. Бұл + сияқты URI-де сақталған таңбаларды қолданбау арқылы болдырылмайды. SegWit үшін ол Bech32-мен ауыстырылды (төменде қараңыз). Base62 Кез келген ~74% Rust, Python Base64-ке ұқсас, бірақ тек әріптік-цифрлық таңбаларды қамтиды. Base64 Кез келген 75% awk, C, C(2), Delphi, Go, Python, тағы да көптеген 1987 жылы алғаш рет көрсетілген ерте және әлі де танымал кодтау. Base85 Кез келген 80% C, Python, Python(2) Ascii85-тің қайта қарастырылған нұсқасы. Base91 Кез келген 81% C#, F# Тұрақты ені бар нұсқасы baseE91 Кез келген 81% C, Java, PHP, 8086 Assembly, AWK, C#, F#, Rust Айнымалы ені бар нұсқасы Base94 Кез келген 82% Python, C, Rust Base122 Кез келген 87.5% JavaScript, Python, Java Base125 Python және Javascript, Go, C BaseXML Кез келген 83.5% C, Python, JavaScript Bech32 Кез келген 62.5% + кемінде 8 таңба (маркер, ажыратқыш, 6 таңбалы ECC) C, C++, JavaScript, Go, Python, Haskell, Ruby, Rust Спецификация. Биткоин және Lightning Network-те қолданылады. Деректер бөлігі Base32 сияқты кодталады, соңында 6 таңбалы BCH кодын қолдана отырып, 6 қате таңбаны тексеру және түзету мүмкіндігі бар, ол сонымен қатар адам оқи алатын бөлікті тексереді/түзетуге мүмкіндік береді. Bech32m нұсқасында ұзындығы өзгерген кезде оның өзгеруіне төзімділік беретін шағын өзгеріс бар. BinHex Кез келген 75% Perl, C, C(2) MacOS Classic Ондық сан ~42% Көптеген тілдер Әдетте адамдар үшін кіріс/шығыс үшін әдепкі бейнелеу. Он алтылық (негізгі 16) Кез келген 50% Көптеген тілдер Үлкен және кіші әріптерде бар Intel HEX Кез келген ≲50% C кітапханасы, C++ Әдетте EPROM, NOR флэш жады микросхемаларын бағдарламалауға қолданылады. MIME Кез келген Цитатасы басып шығаруға және Base64 қараңыз Цитатасы басып шығаруға және Base64 қараңыз Электрондық пошта үшін кодтау контейнері пішімдеу сияқты Пайыздық кодтау Мәтін (URI), Кез келген (RFC1738) ~40% (33–70%) C, Python, мүмкін тағы да көп Цитатасы басып шығаруға арналған мәтін ~33–100% Мүмкін, көптеген сызық үзілістерін сақтайды; 76 таңбадағы сызықтарды кесіп тастайды S жазбасы (Motorola hex) Кез келген 49.6% C кітапханасы, C++ Әдетте EPROM, NOR флэш жады микросхемаларын бағдарламалауға қолданылады. 49.6% бір жазбаға 255 бинарлы байт беріледі. Tektronix hex Кез келген Әдетте EPROM, NOR флэш жады чиптерін бағдарламалауға қолданылады. Uuencoding Кез келген ~60% (70%-ға дейін) Perl, C, Delphi, Java, Python, мүмкін тағы да көп Unix үшін 1980 жылы Unix Copy үшін жасалған ерте кодтау. MIME және yEnc Xxencoding арқылы ауыстырылды Кез келген ~75% (Uuencoding сияқты) C, Delphi ASCII және EBCDIC жүйелері арасындағы таңбалар жиынтығын аудару проблемаларын болдырмау үшін Uuencoding орнына ұсынылды (және кейде қолданылады). z85 (ZeroMQ spec:32/Z85) Бинарлық & ASCII 80% (Ascii85/Base85 сияқты) C (түпнұсқа), C#, Dart, Erlang, Go, Lua, Ruby, Rust және басқалар Ascii85 сияқты ASCII қосалқы жиынтығын анықтайды, бағдарламаның қателеріне себеп болатын бірнеше таңбаларды қалдырады (` \ " ' , ;). Формат ZeroMQ spec:32/Z85 талаптарына сәйкес келеді. (S/KEY) Кез келген 33% C, 64 биттік әр сан 2048 сөздіктің алты қысқа сөзіне сәйкес келеді. 95 isprint кодтары 32–126 ASCII басып шығатын таңбалар деп аталады. Кейбір ескі және қазіргі кездегі жиі кездеспейтін форматтарға BOO, BTOA және USR кодтамасы кіреді. Бұл кодтамалардың көпшілігі тек ASCII басып шығаратын таңбалардың кіші жиынтығын қамтитын мәтінді жасайды: мысалы, base64 кодтамасы тек үлкен және кіші әріптер (A–Z, a–z), сандар (0–9) және "+", "/" және "=" символдары бар мәтінді жасайды. Кейбір кодтаулар (көшірме және пайыздық кодтау) рұқсат етілген таңбалар жиынтығы мен бір ғана қашқыш таңбаға негізделген. Рұқсат етілген таңбалар өзгеріссіз қалдырылады, ал қалған барлық таңбалар қашқыш таңбамен басталатын тізбекке айналдырылады. Бұл түрдегі түрлендіру нәтижесіндегі мәтінді оқуға мүмкіндік береді, себебі әріптер мен сандар рұқсат етілген таңбалардың қатарында болады және кодталған мәтінде өзгеріссіз қалдырылады. Бұл кодтаулар кіріс басып шығаруға жарамды ASCII болған жағдайда ең қысқа жай ASCII шығысын жасайды. Кейбір басқа кодтаулар (base64, uuencoding) барлық мүмкін алты биттік тізбектерді әртүрлі басып шығаруға жарамды таңбаларға бейімдеуге негізделген. Басып шығаруға жарамды 26-дан астам таңба болғандықтан, бұл мүмкін. Берілген байттар тізбегі біттер ағыны ретінде қарастырылады, бұл ағын алты биттік бөліктерге бөлінеді және сәйкес таңбалар тізбегі жасалады. Әртүрлі кодтаулар біттер тізбегі мен таңбалар арасындағы бейімдеуде және нәтижесіндегі мәтін қалай пішімделгендігінде өзгешеліктерге ие. Кейбір кодтаулар (BinHex-тің бастапқы нұсқасы және CipherSaber үшін ұсынылған кодтау) алтының орнына төрт бит қолданады, барлық мүмкін 4 биттік тізбектерді 16 стандартты он алтылық санға бейімдейді. Кодталған әр таңбаға 4 бит қолдану base64-тен 50%-ға ұзақ шығысқа әкеледі, бірақ кодтауды және декодтауды жеңілдетеді – көзді таңбаларды 4 байтқа кеңейту base64-тің 3 көзді байтты 4 кодталған байтқа кеңейтуінен қарапайым. PETSCII-дің алғашқы 192 кодының 164-і басып шығаруға жарамды өкілдіктерге ие: 5 (ақ), 17–20 және 28–31 (түстер және курсор басқарулары), 32–90 (ascii эквиваленті), 91–127 (графика), 129 (қызғылт сары), 133–140 (функциялық пернелер), 144–159 (түстер және курсор басқарулары) және 160–192 (графика). Бұл PETSCII сөйлейтін машиналар арасында base128 сияқты кодтауларға мүмкіндік береді.