Base-N կոդավորման համակարգ. իրականացումը Python-ի ստանդարտ գրադարանում

Ծրագրավորման լեզուներ

Ani Mkrtchyan | AM
Picsart Academy
4 min readMay 18, 2022

--

An encoding emerges from the tendency to conceptualize information; it is the result of an abstraction, a construction of the mind. (Haralambous, 2007)

Տվյալների կոդավորման խնդիրը տեղեկատվության հեռահար փոխանցման հնագույն խնդիրներից է։ Դեռևս հին հույները մշակել են հունական այբուբենը կոդավորելու մեթոդ` ըստ 2 տարբեր պատերին հինգ վառվող կամ հանգած ջահերի համադրության (թվով 2⁵ = 32 համադրություն):

Ջահային ազդանշանի հին հունական ծածկագրի դիագրամ

Եթե հին հույները նպատակ են ունեցել ոչ միայն փոխանցել տեղեկատվությունը, այլև ծածկագրել այն, ապա առավել ժամանակակից կոդավորման (encoding) միակ նպատակը տվյալների ճշգրիտ փոխանցումն է մի համակարգից մյուսը (օրինակ՝ Մորզեի այբուբենը կամ նիշերի կոդավորման ASCII աղյուսակը):

Ընդհանուր առմամբ, կոդավորումը տվյալների փոխակերպումն է մի ձևաչափից մյուսը, որպեսզի դրանք միանշանակ հասկանալի լինեն և օգտագործվեն տարբեր համակարգերի կողմից։

Ամենատարածված կոդավորման մեթոդներից են նիշերի ASCII և Unicode համակարգերը, որոնց միջոցով բինար տվյալները վերածվում են մարդու կողմից ընթեռնելի տեքստի (ստանդարտ ASCII-ն ներկայացնում է 7-բիթանոց 128 նիշեր, ընդլայնված ASCII-ն պարունակում է 8-բիթանոց 256 նիշեր, իսկ Unicode-ը ներառում է ավելի քան հարյուր հազար նիշ՝ նախատեսելով ոչ միայն լատինական տառերի, այլև գործնականում գրեթե բոլոր լեզուների նիշերի կոդավորում):

Իր հերթին, Base-N կոդավորումը լուծում է սկզբունքորեն այլ խնդիր՝ ապահովելով տվայլների փոխանցումը և օգտագործումը այն համակարգերի համար, որոնք կարող են ընդունել միայն ASCII նիշերով արտահայտված տվյալներ, օրինակ, SMTP(Simple Mail Transfer Protocol) հիման վրա աշխատող էլեկտրոնային փոստի համակարգը։

Ըստ այդմ, Base-N մեթոդով բինար տվյալները կոդավորվում են ASCII N քանակի (16, 32, 64 կամ 85)՝ տպագրելի նիշերի միջոցով:

Տարածված Base-N համակարգերից է Base64-ը, որի ալգորիթմի նկարագրությունը կարելի է գտնել դեռևս 1993 թվականի MIME (Multipurpose Internet Mail Extensions) արձանագրություններում (RFC 1521), ըստ որի, Base64 կոդավորման ենթակա են կամայական 8-բիթանոց տվյալները։
Կոդավորումը կատարվում է ASCII 64+1 նիշերով։

Base64 ստանդարտ այբուբենն ունի հետևյալ տեսքը․

Base 64; RFC 1521

Իսկ ինչպե՞ս է տեղի ունենում կոդավորումն ըստ base64-ի։

Նախ, մուտքային բիթերի 24-բիթանոց խմբերը վերակազմավորվում են որպես չորս՝ 6-բիթանոց խմբեր, որոնցից յուրաքանչյուրը այնուհետ թարգմանվում է մեկ թվանշանով՝ ըստ base64 այբուբենի:
Երբ մուտքային խմբում հասանելի է 24-ից քիչ բիթ, աջ կողմից ավելացվում է զրոյական բիթ՝ ձևավորելու 6-բիթանոց ամբողջական խումբ:
Տվյալների այդպիսի լրացումը ստանդարտ մոտեցմամբ կատարվում է “=” նիշի միջոցով (padding):
Բնականաբար, նման կոդավորման արդյունքում սկզբնական տվյալների քանակը ավելանում է (ըստ RFC 1521-ի, մոտ 33%-ով):

Դիտարկենք “abc” տեքստի base64 կոդավորման օրինակի ալգորիթմը.

“abc” string-ի base64 կոդավորման ալգորիթմը

Եթե, ի սկզբանե Base-N կոդավորումը ծառայում էր էլեկտրոնային տեքստային հաղորդակցության համար, ապա այժմ այն կիրառվում է նաև որպես օբյեկտի՝ տեքստային տեսքի բերելու գործիք։
Օրինակ, նման կոդավորմամբ հնարավոր է նկարը ուղղակիորեն արտապատկերել էլեկտրոնային նամակի տեքստի շրջանակներում։
Հարկ է նշել, որ Base64 այբուբենն ունի նաև, այսպես կոչված, “URL and Filename Safe” տարբերակը, երբ 62 և 63-րդ նիշերը փոխարինվում են այլ նիշերով (“-”,“_”):

Ի՞նչ առանձնահատկություններ ունի Pythonbase64 մոդուլը։
Pythonbase64 ստանդարտ մոդուլը տրամադրում է ուղղակի Base-N (16, 32, 64, 85) համակարգերով կոդավորում և ապակոդավորում իրականացնելու ֆունկցիաներ։
Դիտարկենք “Երևան” տեքստի կոդավորման օրինակը՝ իրականացվածPython-ի ստանդարտ base64 ֆունկցիաներով.

import base64# Creating "Երևան" string and encoding it to an equivalent bytes object.
1) message = "Երևան"
# output: <class 'str'>
2) message_bytes = message.encode()
# output: b'\xd4\xb5\xd6\x80\xd6\x87\xd5\xa1\xd5\xb6';
<class 'bytes'>
# Encoding by base64 to get an object of bytes class, that contains only ASCII symbols.
3) message_b64_bytes = base64.b64encode(message_bytes)
# output: b'1LXWgNaH1aHVtg=='; <class 'bytes'>
# Finally, base64 encoded bytes are decoded to a string object to be able to be transferred, for instance, via an SMTP email.
4) message_b64 = message_b64_bytes.decode()
# output:1LXWgNaH1aHVtg==, <class 'str'>

Նման ձևով ստացված տվյալները պետք է ապակոդավորվեն՝ անցնելով վերը ներկայացրած քայլերը հակառակ հերթականությամբ։

message_b64_bytes_1 = message_b64.encode()
message_b64_1 = base64.b64decode(message_b64_bytes_1)
message_1 = message_b64_1.decode()

Պետք է նշել, որ pythonstringencode() մեթոդը կատարում է տեքստի կոդավորում և, համակարգը չնշելու պարագայում, աշխատում է utf-8 ալգորիթմով։
Base64 մոդուլը պարունակում է նաև URL and Filename Safe base64 կոդավորման համար նախատեսված ֆունկցիաներ՝
urlsafe_b64decode(s), urlsafe_b64encode(s

Տվյալների կոդավորման, մասնավորապես, Base-N կոդավորման համակարգերի մասին ավելի մանրամասն տեղեկություններ կարելի է գտնել հետևյալ աղբյուրներից, որոնք էլ հենց ընկած են ներկայացված նյութի հիմքում։

--

--