Base64-codering en decodering met Python

Stel dat u een binair afbeeldingsbestand hebt dat u via een netwerk wilt overbrengen. Je staat er versteld van dat het bestand aan de andere kant niet goed is ontvangen - het bestand bevatte alleen vreemde tekens!

Nou, het lijkt erop dat je probeerde je bestand in de onbewerkte bits en bytes-indeling te verzenden, terwijl de gebruikte media was ontworpen voor het streamen van tekst.

Wat zou de oplossing zijn om zo'n probleem te voorkomen? Het antwoord is Base64-codering. In dit artikel zal ik je laten zien hoe we Python kunnen gebruiken om een ​​binaire afbeelding te coderen en decoderen. Het programma wordt geïllustreerd als een op zichzelf staand lokaal programma, maar u kunt het concept toepassen op verschillende toepassingen, zoals het verzenden van uw gecodeerde afbeelding van uw mobiele apparaat naar een server en vele andere toepassingen.

Wat is Base64?

Voordat we verder gaan met het artikel, laten we definiëren wat we bedoelen met Base64.

Base64 is een manier waarop 8-bits binaire gegevens worden gecodeerd in een indeling die kan worden weergegeven in 7 bits. Dit gebeurt alleen met behulp van de karakters AZ, az, 0-9, +, en / om gegevens te representeren, met = gebruikt om gegevens op te slaan. Met behulp van deze codering worden bijvoorbeeld drie 8-bits bytes geconverteerd naar vier 7-bits bytes.

De term Base64 is afkomstig van de MIME-standaard (Multipurpose Internet Mail Extensions), die veel wordt gebruikt voor HTTP en XML en oorspronkelijk is ontwikkeld voor het coderen van e-mailbijlagen voor verzending.

Waarom gebruiken we Base64?

Base64 is erg belangrijk voor binaire gegevensrepresentatie, zodat binaire gegevens kunnen worden weergegeven op een manier die eruit ziet en fungeert als platte tekst, waardoor het betrouwbaarder is om te worden opgeslagen in databases, e-mails worden verzonden of worden gebruikt in tekstgebaseerde formaat zoals XML. Base64 wordt voornamelijk gebruikt voor het weergeven van gegevens in een ASCII-reeksindeling.

Zoals vermeld in de inleiding van dit artikel, kunnen zonder Base64 gegevens soms helemaal niet leesbaar zijn.

Base64-codering

Base64-codering is het proces waarbij binaire gegevens worden geconverteerd naar een beperkte tekenset van 64 tekens. Zoals in het eerste gedeelte wordt getoond, zijn die tekens AZ, az, 0-9, +, en / (tel ze, heb je gemerkt dat ze optellen tot 64?). Deze tekenset wordt beschouwd als de meest voorkomende tekenset en wordt MIME's Base64 genoemd. Het gebruikt AZ, az, 0-9, +, en / voor de eerste 62 waarden, en +, en / voor de laatste twee waarden.

De Base64-gecodeerde gegevens zijn uiteindelijk langer dan de oorspronkelijke gegevens, zodat zoals hierboven vermeld, voor elke 3 bytes binaire gegevens er ten minste 4 bytes aan Base64-gecodeerde gegevens zijn. Dit komt door het feit dat we de gegevens in een kleiner aantal tekens uitpersen.

Heb je ooit een deel van een onbewerkt e-mailbestand gezien zoals hieronder (wat waarschijnlijk afkomstig is van een e-mail die niet wordt afgeleverd)? Als dat zo is, hebt u Base64-codering in actie gezien! (Als u "=" opmerkt, kunt u concluderen dat dit een Base64-codering is, omdat het gelijkteken wordt gebruikt in het coderingsproces voor opvulling.)

"plain Content-Type: text / plain; 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 wordt als volgt in meerdere stappen uitgevoerd:

  • De te coderen tekst wordt omgezet in zijn respectievelijke decimale waarden, dat wil zeggen in hun ASCII-equivalent (dat wil zeggen a: 97, b: 98, enz.). Dit is de ASCII-tabel.
  • De decimale waarden verkregen in de bovenstaande stap worden omgezet in hun binaire equivalenten (d.w.z. 97: 01100001).
  • Alle binaire equivalenten worden aaneengeschakeld, waardoor een groot aantal binaire getallen wordt verkregen.
  • De grote reeks binaire getallen is verdeeld in gelijke secties, waarbij elke sectie slechts 6 bits bevat.
  • De gelijke sets van 6 bits worden omgezet in hun decimale equivalenten.
  • Tenslotte worden de decimale equivalenten omgezet in hun Base64-waarden (d.w.z. 4: E). Dit zijn de decimale waarden en hun Base64-alfabet.

Base64-decodering

Base64-decodering is het tegenovergestelde van Base64-codering. Met andere woorden, het wordt uitgevoerd door de stappen die in de vorige paragraaf zijn beschreven om te keren.

Dus, de stappen van Base64-decodering kunnen als volgt worden beschreven:

  • Elk teken in de reeks wordt gewijzigd in de decimale waarde van Base64.
  • De verkregen decimale waarden worden omgezet in hun binaire equivalenten.
  • De eerste twee bits van de binaire getallen worden afgekapt van elk van de verkregen binaire getallen en de sets van 6 bits worden gecombineerd, waarbij één grote reeks binaire cijfers wordt gevormd.
  • De grote reeks binaire cijfers die in de vorige stap is verkregen, wordt opgesplitst in groepen van 8 bits.
  • De 8-bits binaire getallen worden geconverteerd naar hun decimale equivalenten.
  • Ten slotte worden de verkregen decimale waarden omgezet in hun ASCII-equivalent.

Een afbeelding coderen

Laten we nu naar het vlees van dit artikel gaan. In deze sectie laat ik je zien hoe we Base64 gemakkelijk een afbeelding kunnen coderen met behulp van Python.

Ik zal de volgende binaire afbeelding gebruiken. Ga je gang, download het en laten we Python aan het rollen krijgen! (Ik neem aan dat de naam van de afbeelding dat is deer.gif.)

Het eerste dat we moeten doen om Base64 in Python te gebruiken, is door de base64-module te importeren:

import base64

Om de afbeelding te coderen, gebruiken we eenvoudig de functie base64.encodestring (s). Python vermeldt het volgende met betrekking tot deze functie:

Codeer de tekenreeks s die willekeurige binaire gegevens kan bevatten en retourneer een tekenreeks die een of meer regels met base64-gecodeerde gegevens bevat. encodestring () retourneert een tekenreeks met een of meer regels met base64-gecodeerde gegevens altijd inclusief een extra achterliggende nieuwe regel ('\ n').

We kunnen dus het volgende doen om Base64 onze afbeelding te laten coderen:

plain import base64 image = open ('deer.gif', 'rb') #open binair bestand in leesmodus image_read = image.read () image_64_encode = base64.encodestring (image_read)

Als u de uitvoer van het coderingsproces wilt zien, typt u het volgende:

print afbeelding_64_encode

Een afbeelding decoderen

Om een ​​afbeelding met Python te decoderen, gebruiken we eenvoudig de base64.decodestring (s) functie. Python vermeldt het volgende met betrekking tot deze functie:

Decodeer de tekenreeks s, die een of meer regels met base64-gecodeerde gegevens moet bevatten, en retourneer een tekenreeks met de resulterende binaire gegevens.

Dus, om de afbeelding die we in het vorige gedeelte hebben gecodeerd te decoderen, doen we het volgende:

base64.decodestring (image_64_encode)

Alles samenvoegen

Laten we het programma plaatsen dat Base64 samen codeert en decodeert. Het Python-script dat dat doet zou er ongeveer als volgt uit moeten zien:

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') # maak een schrijfbare afbeelding en schrijf het resultaat van de decodering image_result.write (image_64_decode)

Als je opent deer_decode.gif die je op je bureaublad hebt, zul je merken dat je de originele afbeelding hebt deer.gif we hebben in de eerste stap gecodeerd.

Zoals we in dit artikel hebben gezien, maakt Python het heel gemakkelijk om wat een complexe taak lijkt uit te voeren.

Leer Python

Leer Python met onze complete python-handleiding, of je nu net begint of dat je een ervaren coder bent die op zoek is naar nieuwe vaardigheden.