Codifica e decodifica Base64 con Python

Supponiamo che tu abbia un file di immagine binario che desideri trasferire su una rete. Sei stupito che il file non sia stato ricevuto correttamente dall'altra parte: il file conteneva solo caratteri strani!

Beh, sembra che tu abbia tentato di inviare il tuo file nel formato bit e byte grezzi, mentre il supporto utilizzato è stato progettato per lo streaming di testo.

Quale sarebbe la soluzione alternativa per evitare tale problema? La risposta è la codifica Base64. In questo articolo, ti mostrerò come possiamo usare Python per codificare e decodificare un'immagine binaria. Il programma è illustrato come programma locale autonomo, ma è possibile applicare il concetto a diverse applicazioni come l'invio di immagini codificate dal dispositivo mobile a un server e molte altre applicazioni.

Che cos'è Base64?

Prima di passare più in profondità nell'articolo, definiamo cosa intendiamo per Base64.

Base64 è un modo in cui i dati binari a 8 bit sono codificati in un formato che può essere rappresentato in 7 bit. Questo è fatto usando solo i personaggi A-Z, a-z, 0-9, +, e / per rappresentare i dati, con = utilizzato per il rilievo dei dati. Ad esempio, utilizzando questa codifica, tre byte da 8 bit vengono convertiti in quattro byte da 7 bit.

Il termine Base64 è tratto dallo standard MIME (Multipurpose Internet Mail Extensions), ampiamente utilizzato per HTTP e XML, ed è stato originariamente sviluppato per codificare allegati e-mail per la trasmissione.

Perché usiamo Base64?

Base64 è molto importante per la rappresentazione di dati binari, in modo tale che sia possibile rappresentare i dati binari in un modo che assomigli e funga da testo semplice, il che rende più affidabile la memorizzazione nei database, l'invio di e-mail o l'utilizzo in testo formato come XML. Base64 è fondamentalmente utilizzato per rappresentare i dati in un formato di stringa ASCII.

Come menzionato nell'introduzione di questo articolo, senza Base64 a volte i dati non saranno affatto leggibili.

Codifica Base64

La codifica Base64 è il processo di conversione di dati binari in un set di caratteri limitato di 64 caratteri. Come mostrato nella prima sezione, quei personaggi sono A-Z, a-z, 0-9, +, e / (contali, hai notato che aggiungono fino a 64?). Questo set di caratteri è considerato il set di caratteri più comune e viene chiamato Base64 di MIME. Utilizza A-Z, a-z, 0-9, +, e / per i primi 62 valori, e +, e / per gli ultimi due valori.

I dati codificati Base64 finiscono per essere più lunghi dei dati originali, quindi, come detto sopra, per ogni 3 byte di dati binari, ci sono almeno 4 byte di dati codificati Base64. Ciò è dovuto al fatto che stiamo spremendo i dati in un insieme più piccolo di caratteri.

Hai mai visto parte di un file di posta elettronica non elaborato come quello mostrato di seguito (che molto probabilmente proviene da un'e-mail che non viene consegnata)? Se è così, allora hai visto la codifica Base64 in azione! (Se noti "=", puoi concludere che questa è una codifica Base64, poiché il segno di uguale è usato nel processo di codifica per il riempimento).

"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 viene eseguito in più passaggi, come segue:

  • Il testo da codificare in convertiti nei rispettivi valori decimali, cioè nel loro equivalente ASCII (cioè a: 97, b: 98, ecc.). Ecco la tabella ASCII.
  • I valori decimali ottenuti nel passaggio precedente vengono convertiti nei loro equivalenti binari (ad esempio 97: 01100001).
  • Tutti gli equivalenti binari sono concatenati, ottenendo un ampio set di numeri binari.
  • L'ampio set di numeri binari è diviso in sezioni uguali, con ogni sezione contenente solo 6 bit.
  • Gli insiemi uguali di 6 bit vengono convertiti nei loro equivalenti decimali.
  • Infine, gli equivalenti decimali vengono convertiti nei loro valori Base64 (cioè 4: E). Ecco i valori decimali e il loro alfabeto Base64.

Base64 Decoding

La decodifica Base64 è l'opposto della codifica Base64. In altre parole, viene eseguito invertendo i passaggi descritti nella sezione precedente.

Quindi, i passaggi della decodifica Base64 possono essere descritti come segue:

  • Ogni carattere nella stringa viene modificato nel suo valore decimale Base64.
  • I valori decimali ottenuti vengono convertiti nei loro equivalenti binari.
  • I primi due bit dei numeri binari vengono troncati da ciascuno dei numeri binari ottenuti e gli insiemi di 6 bit vengono combinati, formando una grande stringa di cifre binarie.
  • La grande stringa di cifre binarie ottenuta nel passaggio precedente è divisa in gruppi di 8 bit.
  • I numeri binari a 8 bit vengono convertiti nei loro equivalenti decimali.
  • Infine, i valori decimali ottenuti vengono convertiti nel loro equivalente ASCII.

Codifica di un'immagine

Passiamo ora alla carne di questo articolo. In questa sezione, ti mostrerò come possiamo facilmente Base64 codificare un'immagine usando Python.

Userò la seguente immagine binaria. Vai avanti, scaricalo e facciamo girare Python! (Suppongo che il nome dell'immagine sia deer.gif.)

La prima cosa che dobbiamo fare per usare Base64 in Python è importare il modulo base64:

importazione base64

Per codificare l'immagine, utilizziamo semplicemente la funzione base64.encodestring (s). Python menziona quanto segue riguardo a questa funzione:

Codifica la stringa s, che può contenere dati binari arbitrari e restituisce una stringa contenente una o più righe di dati codificati in base64. encodestring () restituisce una stringa contenente una o più righe di dati con codifica Base64 che includono sempre una nuova riga finale finale ('\ n').

Quindi, possiamo fare quanto segue al fine di codificare Base64 la nostra immagine:

semplice importazione base64 image = open ('deer.gif', 'rb') #open file binario in modalità lettura image_read = image.read () image_64_encode = base64.encodestring (image_read)

Se si desidera vedere l'output del processo di codifica, digitare quanto segue:

stampa image_64_encode

Decodifica di un'immagine

Per decodificare un'immagine usando Python, usiamo semplicemente il base64.decodestring (s) funzione. Python menziona quanto segue riguardo a questa funzione:

Decodifica la stringa s, che deve contenere una o più righe di dati codificati base64 e restituire una stringa contenente i dati binari risultanti.

Quindi, al fine di decodificare l'immagine che abbiamo codificato nella sezione precedente, facciamo quanto segue:

base64.decodestring (image_64_encode)

Mettere tutto insieme

Mettiamo il programma che Base64 codifica e decodifica un'immagine insieme. Lo script Python che lo fa dovrebbe apparire come il seguente:

import python 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') # crea un'immagine scrivibile e scrive il risultato di decodifica image_result.write (image_64_decode)

Se apri deer_decode.gif che hai sul tuo desktop, noterai che hai l'immagine originale deer.gif abbiamo codificato nel primo passo.

Come abbiamo visto in questo articolo, Python rende molto facile eseguire quello che sembra essere un compito complesso.

Impara Python

Impara Python con la nostra guida completa al tutorial su Python, sia che tu stia appena iniziando o che sei un programmatore esperto che cerca di imparare nuove abilità.