Una funzione di codifica in Base64 in linguaggio Python senza l’utilizzo della libreria Base64
Nei seguenti esempi di funzione di codifica e decodifica ho utilizzato una libreria di Python per la conversione in Base64. L’obiettivo del seguente codice è di riprodurre la codifica senza l’ausilio di una libreria apposita.
def string_to_base64(input_string):
# Tabella dei caratteri Base64
base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
# Conversione della stringa in byte (UTF-8)
byte_array = input_string.encode("utf-8")
# Conversione dei byte in binario
binary_string = ''.join(format(byte, '08b') for byte in byte_array)
# Padding per raggiungere un multiplo di 6 bit
padding = (6 - len(binary_string) % 6) % 6
binary_string_padded = binary_string + '0' * padding
# Divisione in gruppi da 6 bit
six_bit_groups = [binary_string_padded[i:i+6] for i in range(0, len(binary_string_padded), 6)]
# Mappatura a caratteri Base64
encoded_string = ''.join(base64_chars[int(bits, 2)] for bits in six_bit_groups)
# Aggiunta del padding finale per raggiungere un multiplo di 4
final_padding = '=' * ((4 - len(encoded_string) % 4) % 4)
return encoded_string + final_padding
Analizziamo ogni passaggio in dettaglio:
Nella riga tre, la variabile “base64_chars” contiene tutti i 64 caratteri utilizzati nella codifica Base64. Questi includono lettere maiuscole e minuscole (A-Z, a-z), numeri (0-9), più (+) e slash (/). Questa tabella è utilizzata per mappare gruppi di 6 bit ai corrispondenti caratteri Base64.
Conversione della Stringa in Byte (UTF-8):
Nella riga sei, la stringa “input_string” viene convertita in un array di byte utilizzando la codifica UTF-8. Questo è necessario perché Base64 opera su dati binari.
Nella riga nove, ciascun byte dell’array viene convertito in una stringa binaria a 8 bit (un byte) usando la funzione format. Queste stringhe binarie sono poi concatenate per formare una singola “binary_string“.
La codifica Base64 opera su blocchi di 6 bit. Se la lunghezza della “binary_string” non è un multiplo di 6, viene aggiunto un padding di zeri (0) alla fine per raggiungere il multiplo più vicino di 6. La variabile “binary_string_padded” contiene la stringa codificata più il padding di zeri. Il tutto viene eseguito nelle righe dodici e tredici.
La stringa binaria viene divisa in gruppi da 6 bit. Questo viene fatto suddividendo la “binary_string_padded” in segmenti da 6 bit ciascuno. La variabile “six_bit_groups” contiene i segmenti da 6 bit ciascuno. La riga sedici esegue questa operazione di suddivisione.
Nella riga diciannove, ogni gruppo di 6 bit viene convertito in un intero (usando la base 2) e poi mappato a un carattere corrispondente in base64_chars. Questo forma la stringa codificata “encoded_string“.
Nella riga ventidue, si verifica la lunghezza della stringa codificata “encoded_string” deve essere un multiplo di 4. Se non lo è, vengono aggiunti uno o più caratteri di uguale (=) come padding alla fine di “encoded_string“.
Infine, la funzione ritorna la stringa codificata in Base64, che include sia la conversione dei dati originali sia il padding necessario per soddisfare i requisiti della codifica Base64.