Base64-koding og dekoding ved hjelp av Python

Si at du har en binær bildefil du ønsket å overføre over et nettverk. Du er overrasket over at filen ikke ble mottatt riktig på den andre siden - filen inneholdt bare merkelige tegn!

Vel, det virker som om du forsøkte å sende filen din i råbiter og bytesformat, mens det brukte mediet var designet for streamingtekst.

Hva ville være løsningen for å unngå et slikt problem? Svaret er Base64-koding. I denne artikkelen vil jeg vise deg hvordan vi kan bruke Python til å kode og dekode et binært bilde. Programmet er illustrert som et frittstående lokalt program, men du kan bruke konseptet til forskjellige applikasjoner som å sende ditt kodede bilde fra mobilenheten til en server, og mange andre applikasjoner.

Hva er Base64?

Før vi beveger oss mer dypere i artikkelen, la oss definere hva vi mener med Base64.

Base64 er en måte hvor 8-bits binære data er kodet inn i et format som kan representeres i 7 biter. Dette gjøres ved å bruke bare tegnene A-Z, a-z, 0-9, +, og / for å representere data, med = pleide å pad data. For eksempel, ved hjelp av denne kodingen, konverteres tre 8-bit byte til fire 7-bit byte.

Begrepet Base64 er hentet fra MTP-standarden (Multipurpose Internet Mail Extensions), som er mye brukt for HTTP og XML, og ble opprinnelig utviklet for koding av e-postvedlegg for overføring.

Hvorfor bruker vi Base64?

Base64 er svært viktig for binær data representasjon, slik at den lar binære data bli representert på en måte som ser ut og fungerer som ren tekst, noe som gjør det mer pålitelig å bli lagret i databaser, sendt i e-post eller brukt i tekstbasert format som XML. Base64 brukes i utgangspunktet til å representere data i et ASCII-strengformat.

Som nevnt i introduksjonen til denne artikkelen, kan Base64 noen ganger ikke lese data i det hele tatt.

Base64-koding

Base64-koding er prosessen med å konvertere binære data til et begrenset tegnsett med 64 tegn. Som vist i første avsnitt, er disse tegnene A-Z, a-z, 0-9, +, og / (telle dem, la du merke til at de legger opp til 64?). Denne tegnsettet anses å være det vanligste tegnsettet, og refereres til som MIMEs Base64. Det bruker A-Z, a-z, 0-9, +, og / for de første 62 verdiene, og +, og / for de to siste verdiene.

Base64-kodede data ender opp med å være lengre enn de opprinnelige dataene, slik at som nevnt ovenfor, for hver 3 byte binære data, er det minst 4 byte av Base64-kodede data. Dette skyldes det faktum at vi klemmer dataene inn i et mindre sett med tegn.

Har du noen gang sett en del av en rå e-postfil som den som vist nedenfor (som sannsynligvis kommer fra en epost som ikke blir levert)? I så fall har du sett Base64-koding i aksjon! (Hvis du merker "=", kan du konkludere med at dette er en Base64-koding, siden likestegnet brukes i kodingsprosessen for polstring.)

"vanlig innholdstype: tekst / vanlig; 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 utføres i flere trinn, som følger:

  • Teksten som skal kodes, konverteres til sine respektive desimalverdier, det vil si i deres ASCII-ekvivalent (dvs. a: 97, b: 98, etc.). Her er ASCII-tabellen.
  • Desimalverdiene oppnådd i trinnene ovenfor omdannes til deres binære ekvivalenter (dvs. 97: 01100001).
  • Alle binære ekvivalenter er sammenkoblet, og oppnår et stort sett med binære tall.
  • Det store settet av binære tall er delt inn i like seksjoner, med hver seksjon som inneholder bare 6 biter.
  • De likestillende settene på 6 biter blir omgjort til deres desimalekvivalenter.
  • Endelig konverteres desimalekvivalenter til deres Base64-verdier (dvs. 4: E). Her er desimalverdiene og deres Base64-alfabet.

Base64 Dekoding

Base64-dekoding er motsatt av Base64-koding. Med andre ord utføres det ved å reversere trinnene beskrevet i forrige avsnitt.

Så trinnene i Base64-dekoding kan beskrives som følger:

  • Hver karakter i strengen endres til dens Base64-desimalverdi.
  • Desimalverdiene som er oppnådd, omdannes til deres binære ekvivalenter.
  • De to første bitene av de binære tallene avkortes fra hvert av de binære tallene som er oppnådd, og settene på 6 biter kombineres og danner en stor streng med binære sifre.
  • Den store strengen av binære siffer som er oppnådd i forrige trinn, er delt inn i grupper på 8 biter.
  • De 8-bits binære tallene konverteres til deres desimalekvivalenter.
  • Til slutt konverteres desimalverdiene som er oppnådd, til deres ASCII-ekvivalent.

Koding av et bilde

La oss nå komme til kjøttet i denne artikkelen. I denne delen skal jeg vise deg hvordan vi enkelt kan Base64 kode et bilde ved hjelp av Python.

Jeg skal bruke følgende binære bilde. Gå videre, last ned det og la oss få Python å rulle! (Jeg antar at navnet på bildet er deer.gif.)

Det første vi må gjøre for å kunne bruke Base64 i Python er å importere base64-modulen:

importer base64

For å kodes bildet, bruker vi bare funksjonen base64.encodestring (s). Python nevner følgende om denne funksjonen:

Kod strenget s, som kan inneholde vilkårlig binær data, og returnere en streng som inneholder en eller flere linjer med base64-kodede data. encodestring () returnerer en streng som inneholder en eller flere linjer med base64-kodet data, inkludert alltid en ekstra etterfølgende ny linje ('\ n').

Dermed kan vi gjøre følgende for å Base64 kode inn bildet vårt:

ren import base64 image = open ('deer.gif', 'rb') #open binærfil i lesemodus image_read = image.read () image_64_encode = base64.encodestring (image_read)

Hvis du vil se utdataene fra kodingsprosessen, skriver du inn følgende:

skriv ut image_64_encode

Dekoding av et bilde

For å dekode et bilde ved hjelp av Python bruker vi bare base64.decodestring (s) funksjon. Python nevner følgende om denne funksjonen:

Dekode strengen s, som må inneholde en eller flere linjer med base64 kodede data, og returnere en streng som inneholder de resulterende binære dataene.

Så, for å dekode bildet vi kodet i forrige avsnitt, gjør vi følgende:

base64.decodestring (image_64_encode)

Sette alt sammen

La oss sette programmet som Base64 koder og dekoder et bilde sammen. Python-skriptet som gjør det, bør se ut som følgende:

python import base64 image = 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 = open ('deer_decode.gif' 'wb') # opprett et skrivbart bilde og skriv dekodingsresultatet image_result.write (image_64_decode)

Hvis du åpner deer_decode.gif som du har på skrivebordet ditt, vil du legge merke til at du har det opprinnelige bildet deer.gif vi kodet i første trinn.

Som vi har sett fra denne artikkelen, gjør Python det veldig enkelt å utføre det som synes å være en komplisert oppgave.

Lær python

Lær Python med vår komplette pythonveiledning, enten du er bare i gang eller du er en erfaren coder som ønsker å lære nye ferdigheter..