Base-N կոդավորման համակարգ. իրականացումը Python-ի ստանդարտ գրադարանում
Ծրագրավորման լեզուներ
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
ստանդարտ այբուբենն ունի հետևյալ տեսքը․
Իսկ ինչպե՞ս է տեղի ունենում կոդավորումն ըստ base64
-ի։
Նախ, մուտքային բիթերի 24-բիթանոց խմբերը վերակազմավորվում են որպես չորս՝ 6-բիթանոց խմբեր, որոնցից յուրաքանչյուրը այնուհետ թարգմանվում է մեկ թվանշանով՝ ըստ base64
այբուբենի:
Երբ մուտքային խմբում հասանելի է 24-ից քիչ բիթ, աջ կողմից ավելացվում է զրոյական բիթ՝ ձևավորելու 6-բիթանոց ամբողջական խումբ:
Տվյալների այդպիսի լրացումը ստանդարտ մոտեցմամբ կատարվում է “=”
նիշի միջոցով (padding)
:
Բնականաբար, նման կոդավորման արդյունքում սկզբնական տվյալների քանակը ավելանում է (ըստ RFC 1521
-ի, մոտ 33%-ով):
Դիտարկենք “abc”
տեքստի base64
կոդավորման օրինակի ալգորիթմը.
Եթե, ի սկզբանե Base-N
կոդավորումը ծառայում էր էլեկտրոնային տեքստային հաղորդակցության համար, ապա այժմ այն կիրառվում է նաև որպես օբյեկտի՝ տեքստային տեսքի բերելու գործիք։
Օրինակ, նման կոդավորմամբ հնարավոր է նկարը ուղղակիորեն արտապատկերել էլեկտրոնային նամակի տեքստի շրջանակներում։
Հարկ է նշել, որ Base64
այբուբենն ունի նաև, այսպես կոչված, “URL and Filename Safe”
տարբերակը, երբ 62 և 63-րդ նիշերը փոխարինվում են այլ նիշերով (“-”,“_”)
:
Ի՞նչ առանձնահատկություններ ունի Python
-ի base64
մոդուլը։Python
-ի base64
ստանդարտ մոդուլը տրամադրում է ուղղակի 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()
Պետք է նշել, որ python
-ի string
-ի encode()
մեթոդը կատարում է տեքստի կոդավորում և, համակարգը չնշելու պարագայում, աշխատում է utf-8
ալգորիթմով։ Base64
մոդուլը պարունակում է նաև URL and Filename Safe
base64
կոդավորման համար նախատեսված ֆունկցիաներ՝
urlsafe_b64decode
(s), urlsafe_b64encode
(s)։
Տվյալների կոդավորման, մասնավորապես, Base-N
կոդավորման համակարգերի մասին ավելի մանրամասն տեղեկություններ կարելի է գտնել հետևյալ աղբյուրներից, որոնք էլ հենց ընկած են ներկայացված նյութի հիմքում։
- Python 3.10.4 Documentation: base64: Base16, Base32, Base64, Base85 Data Encodings
- The Unicode 14.0 Standard, The Unicode Consortium, 2021 September 14 Announcement
- RFC 4648, The Base16, Base32, and Base64 Data Encodings, October 2006
- RFC 1521, MIME (Multipurpose Internet Mail Extensions) Part One, September 1993
- Haralambous, Y. (2007). Fonts & Encodings. O’Reilly Media.
- Hellmann, D. (2017). The Python 3 Standard Library by Example. Pearson Education, Inc.