Base64 Encoding și Decoding folosind Python

Spuneți că aveți un fișier imagine binar pe care doriți să îl transferați într-o rețea. Ești uimit că fișierul nu a fost primit corect de cealaltă parte - fișierul conținea numai caractere ciudate!

Părea că ați încercat să trimiteți fișierul în format de biți bruți și octeți, în timp ce mass-media utilizată a fost proiectată pentru streaming text.

Care ar fi soluția pentru a evita o astfel de problemă? Răspunsul este codarea Base64. În acest articol, vă voi arăta cum putem folosi Python pentru a codifica și decoda o imagine binară. Programul este ilustrat ca un program local independent, însă puteți aplica acest concept pentru diferite aplicații, cum ar fi trimiterea imaginii codate de pe dispozitivul dvs. mobil la un server și multe alte aplicații.

Ce este Base64?

Înainte de a vă deplasa mai adânc în articol, să definim ce înțelegem prin Base64.

Base64 este un mod în care datele binare pe 8 biți sunt codificate într-un format care poate fi reprezentat în 7 biți. Acest lucru se face folosind doar caracterele A-Z, a-z, 0-9, +, și / pentru a reprezenta datele, cu = folosit pentru a introduce datele. De exemplu, folosind această codare, trei octeți de 8 biți sunt convertiți în patru octeți de 7 biți.

Termenul Base64 este preluat din standardul MIME (Multipurpose Internet Mail Extensions), folosit pe scară largă pentru HTTP și XML și a fost inițial dezvoltat pentru codarea atașamentelor de e-mail pentru transmisie.

De ce folosim Base64?

Base64 este foarte important pentru reprezentarea datelor binare, astfel încât permite ca datele binare să fie reprezentate într-un mod care arată și acționează ca text simplu, ceea ce îl face mai fiabilă pentru a fi stocată în baze de date, trimisă în e-mailuri sau utilizată în text format, cum ar fi XML. Base64 este utilizat în principal pentru a reprezenta datele într-un format de șir ASCII.

După cum sa menționat în introducerea acestui articol, fără Base64, uneori datele nu vor fi citite deloc.

Codare Base64

Codarea Base64 este procesul de conversie a datelor binare într-un set de caractere limitat de 64 de caractere. După cum se arată în prima secțiune, acele personaje sunt A-Z, a-z, 0-9, +, și / (numără-le, ai observat că se adaugă până la 64?). Acest set de caractere este considerat cel mai obișnuit set de caractere și este denumit Base64 al MIME. Folosește A-Z, a-z, 0-9, +, și / pentru primele 62 de valori și +, și / pentru ultimele două valori.

Datele codate Base64 ajung să fie mai lungi decât datele originale, astfel încât, așa cum sa menționat mai sus, pentru fiecare 3 octeți de date binare, există cel puțin 4 octeți de date codate Base64. Acest lucru se datorează faptului că stoarcem datele într-un set mai mic de caractere.

Ați văzut vreodată o parte dintr-un fișier de e-mail brut ca cel prezentat mai jos (cel mai probabil provine dintr-un e-mail care nu este livrat)? Dacă da, atunci ați văzut codificarea Base64 în acțiune! (Dacă observați "=", puteți concluziona că aceasta este o codare Base64, deoarece semnul egal este folosit în procesul de codificare pentru umplere.)

"conținut simplu: text / simplu; charset = UTF-8 Content-Transfer-Encoding: base64

2KfZhNiz2YTYp9mFINi52YTZitmD2YUg2YjYsdit2YXYqSDYp9mE2YTZhyDZiNio2LHZg9in2KrZ h9iMDQoNCtij2YjYryDZgdmC2Lcg2KfZhNin2LPYqtmB2LPYp9ixINi52YYg2KfZhNmF2YLYsdix 2KfYqiDYp9mE2K / Ysdin2LPZitipINin2YTYqtmKINiq2YbYtdit2YjZhiDYqNmH2Kcg2YTZhdmG INmK2LHZitivINin2YTYqtmI2LPYuSDZgdmKDQrYt9mE2Kgg2KfZhNi52YTZhSDYp9mE2LTYsdi5 2YrYjCDYudmE2YXYpyDYqNij2YbZiiDYutmK2LEg2YXYqtiu2LXYtSDYqNin2YTYudmE2YUg2KfZ hNi02LHYudmKINmI2KPZgdiq2YLYryDZhNmE2YXZhtmH2Kwg2KfZhNi52YTZhdmKDQrZhNiw2YTZ gy4NCg0K2KzYstin2YPZhSDYp9mE2YTZhyDYrtmK2LHYpyDYudmE2Ykg2YbYtdit2YPZhSDZgdmK INmH2LDYpyDYp9mE2LTYo9mGLg0KDQrYudio2K / Yp9mE2LHYrdmF2YYNCg == -089e0141aa264e929a0514593016 Content-Type: text / html; charset = UTF-8 Content-Transfer-Encoding: base64 "

Base64 se efectuează în mai multe etape, după cum urmează:

  • Textul care trebuie codificat este convertit în valorile sale zecimale respective, adică în echivalentul lor ASCII (adică: 97, b: 98, etc.). Iată tabelul ASCII.
  • Valorile zecimale obținute în etapa de mai sus sunt convertite în echivalentele lor binare (adică 97: 01100001).
  • Toate echivalentele binare sunt concatenate, obținând un set mare de numere binare.
  • Setul mare de numere binare este împărțit în secțiuni egale, fiecare secțiune conținând doar 6 biți.
  • Seturile egale de 6 biți sunt convertite în echivalentele lor zecimale.
  • În cele din urmă, echivalentele zecimale sunt convertite în valorile Base64 (adică 4: E). Iată valorile zecimale și alfabetul Base64.

Base64 Decoding

Base64 decodarea este opusul codării Base64. Cu alte cuvinte, aceasta se realizează prin inversarea etapelor descrise în secțiunea anterioară.

Deci, etapele de decodificare Base64 pot fi descrise după cum urmează:

  • Fiecare caracter din șir este schimbat în valoarea zecimală Base64.
  • Valorile zecimale obținute sunt convertite în echivalentele lor binare.
  • Primele două biți ale numerelor binare sunt trunchiate din fiecare dintre numerele binare obținute, iar seturile de 6 biți sunt combinate, formând un șir mare de cifre binare.
  • Șirul mare de cifre binare obținut în etapa anterioară este împărțit în grupuri de 8 biți.
  • Numerele binare pe 8 biți sunt convertite în echivalentele lor zecimale.
  • În cele din urmă, valorile zecimale obținute sunt convertite în echivalentul lor ASCII.

Codarea unei imagini

Să ajungem acum la carnea acestui articol. În această secțiune, vă voi arăta cum putem baza cu ușurință Base64 să codificați o imagine utilizând Python.

Voi folosi următoarea imagine binară. Mergeți mai departe, descărcați-l și lăsați-l pe Python să se rostogolească! (Presupun că numele imaginii este deer.gif.)

Primul lucru pe care trebuie să-l facem pentru a folosi Base64 în Python este de a importa modulul base64:

baza de import64

Pentru a codifica imaginea, pur și simplu folosim funcția base64.encodestring (s). Python menționează următoarele în ceea ce privește această funcție:

Codificați șirul s, care poate conține date binare arbitrare și returnați un șir care conține una sau mai multe linii de date codate de base64. encodestring () returnează un șir care conține una sau mai multe rânduri de date bazate pe base64, care includ întotdeauna o linie nouă extra trailing ('\ n').

Astfel, putem face următoarele pentru ca Base64 să ne codifice imaginea:

simplu import base64 image = open ('deer.gif', 'rb') #open fișier binar în modul citire image_read = image.read () image_64_encode = base64.encodestring (image_read)

Dacă doriți să vedeți ieșirea procesului de codificare, tastați următoarele:

imprimați image_64_encode

Decodificarea unei imagini

Pentru a decoda o imagine folosind Python, pur și simplu folosim base64.decodestring (s) funcţie. Python menționează următoarele în ceea ce privește această funcție:

Decodați șirul s, care trebuie să conțină una sau mai multe rânduri de date codate base64 și returnați un șir care conține datele binare rezultate.

Deci, pentru a decoda imaginea pe care am codificat-o în secțiunea anterioară, facem următoarele:

base64.decodestring (image_64_encode)

Punându-le pe toți împreună

Să punem programul pe care Base64 codifică și decodează o imagine împreună. Scriptul Python care face acest lucru ar trebui să arate cam așa:

Python import base64 imagine = open ('deer.gif', 'rb') image_read = image.read () image_64_encode = base64.encodestring (image_read) image_64_decode = base64.decodestring (image_64_encode) image_result = 'wb') # crea o imagine scriitoare și scrie rezultatul decodării image_result.write (image_64_decode)

Dacă vă deschideți deer_decode.gif pe care îl aveți pe desktop, veți observa că aveți imaginea originală deer.gif am codificat în primul pas.

După cum am văzut din acest articol, Python face foarte ușor să efectueze ceea ce pare a fi o sarcină complexă.

Aflați Python

Aflați Python cu ghidul nostru complet de instrucțiuni Python, indiferent dacă sunteți doar începători sau sunteți un coder experimentat în căutarea unor noi abilități.

Cod