base64 - Codifica dati binari in caratteri ASCII

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

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.

Codifica Base 64

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

Non ci sono caratteri di ritorno a capo nel risultato prodotto dalla libreria, quindi i dati codificati sono stati separati artificialmente per renderli meglio esposti nella pagina
$ python base64_b64encode.py
113 byte prima della codifica
Attesi  1 byte di riempimento
152 byte dopo la codifica

CgppbXBvcnQgYmFzZTY0CgojIExvYWQgdGhpcyBz
b3VyY2UgZmlsZSBhbmQgc3RyaXAgdGhlIGhlYWRl
ci4KaW5pdGlhbF9kYXRhID0gb3BlbihfX2ZpbGVf
XywgJ3J0JykucmVhZCgpLnNwbGl0KCc=

Decodifica Base 64

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

Varianti URL-safe

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=

Altre Codifiche

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

Vedere anche:

base64
La documentazione della libreria standard per questo modulo.
RFC 3548
La codifica dei dati in Base16, Base32 e Base64