| Scopo | Il modulo base64 contiene le funzioni per trascodificare dati binari in un sottoinsieme di ASCII adatti alla trasmissione che usa protocolli di testo semplice |
| Versione Python | 1.4 e superiore |
A partire dal 1 gennaio 2021 le versioni 2.x di Python non sono piu' supportate. Ti invito a consultare la corrispondente versione 3.x dell'articolo per il modulo base64
Le codifiche base64, base32 e base16 convertono byte di 8 bit in valori con 6,5, o 4 bit di dati utili per byte, facendo sì che i byte non-ASCII possano essere codificati come caratteri ASCII per la trasmissione attraverso protocolli che richiedono ASCII semplice, tipo SMTP. I valori base corrispondono alla lunghezza dell'alfabeto usato in ogni codifica. Ci sono anche varianti URL-safe delle codifiche originali che usano risultati leggermente differenti.
Un esempio base di codifica di una porzione di testo potrebbe essere questo:
import base64
# Carica questo file sorgente ed elimina l'intestazione.
initial_data = open(__file__, 'rt').read().split('#end_pymotw_header')[1]
encoded_data = base64.b64encode(initial_data)
num_initial = len(initial_data)
padding = { 0:0, 1:2, 2:1 }[num_initial % 3]
print '%d byte prima della codifica' % num_initial
print 'Attesi %d byte di riempimento' % padding
print '%d byte dopo la codifica' % len(encoded_data)
print
#stampa i dati codificati
for i in xrange((len(encoded_data)/40)+1):
print encoded_data[i*40:(i+1)*40]
Il risultato mostra i 558 byte della sorgente originale espansi a 744 dopo essere stati codificati
$ python base64_b64encode.py 113 byte prima della codifica Attesi 1 byte di riempimento 152 byte dopo la codifica CgppbXBvcnQgYmFzZTY0CgojIExvYWQgdGhpcyBz b3VyY2UgZmlsZSBhbmQgc3RyaXAgdGhlIGhlYWRl ci4KaW5pdGlhbF9kYXRhID0gb3BlbihfX2ZpbGVf XywgJ3J0JykucmVhZCgpLnNwbGl0KCc=
La stringa codificata può essere riconvertita alla forma originale prendendo 4 byte e convertendoli ai 3 originali, usando un reverse lookup. La funzione
b64decode()
si occupa di questo.
import base64
original_string = 'Questi sono i dati, in chiaro.'
print 'Originali :', original_string
encoded_string = base64.b64encode(original_string)
print 'Codificati :', encoded_string
decoded_string = base64.b64decode(encoded_string)
print 'Decodificati:', decoded_string
Il processo di codifica cerca ogni sequenza di 24 bit nell'input (3 byte) e codifica questi stessi 24 bit disponendoli su 4 byte in output. Gli ultimi due caratteri, i due
==
, sono di riempimento visto che il numero di bit della stringa originale non è esattamente divisibile per 24 in questo esempio.
$ python base64_b64decode.py Originali : Questi sono i dati in chiaro Codificati : UXVlc3RpIHNvbm8gaSBkYXRpIGluIGNoaWFybw== Decodificati: Questi sono i dati in chiaro
Visto che l'alfabeto predefinito in base64 potrebbe usare dei
+
o dei
/
, e questi due caratteri sono usati negli URL, si è reso necessario specificare una codifica alternativa con sostituzioni per questi caratteri. Il
+
è sostituito da un
-
e
/
è sosttuito da un carattere di sottolineatura (
_
). Altrimenti, l'alfabeto è il medesimo.
import base64
for original in [ chr(251) + chr(239), chr(255) * 2 ]:
print 'Originale :', repr(original)
print 'Codifica standard:', base64.standard_b64encode(original)
print 'Codifica URL-safe:', base64.urlsafe_b64encode(original)
print
$ python base64_urlsafe.py Originale : '\xfb\xef' Codifica standard: ++8= Codifica URL-safe: --8= Originale : '\xff\xff' Codifica standard: //8= Codifica URL-safe: __8=
A parte base 64, il modulo fornisce funzioni per lavorare con dati codificati in base 32 e base 16 (esadecimale).
import base64
original_string = 'Questi sono i dati in chiaro'
print 'Originali :', original_string
encoded_string = base64.b32encode(original_string)
print 'Codificati :', encoded_string
decoded_string = base64.b32decode(encoded_string)
print 'Decodificati:', decoded_string
$ python base64_base32.py Originali : Questi sono i dati in chiaro Codificati : UXVlc3RpIHNvbm8gaSBkYXRpIGluIGNoaWFybw== Decodificati: Questi sono i dati in chiaro
Le funzioni a base 16 lavorano con l'alfabeto esadecimale
import base64
original_string = 'Questi sono i dati in chiaro'
print 'Originali :', original_string
encoded_string = base64.b16encode(original_string)
print 'Codificati :', encoded_string
decoded_string = base64.b16decode(encoded_string)
print 'Decodificati:', decoded_string
$ python base64_base16.py Originali : Questi sono i dati in chiaro Codificati : 51756573746920736F6E6F2069206461746920696E2063686961726F Decodificati: Questi sono i dati in chiaro