Codificar y decodificar en Base64 con Python

Digamos que tienes que transferir un fichero de imagen binario a través de la red. Al hacerlo, te sorprendes de que el archivo no se ha recibido correctamente al otro lado y que, además, contiene caracteres extraños. Pues bien, esto pasa porque estás intentando enviar un archivo en formato de bytes, mientras que el medio utilizado fue diseñado para transmitir texto.

¿Cuál sería la solución para evitar un problema semejante? La respuesta la tienes en la codificación Base64. En este artículo, voy a mostrar cómo podemos usar Python para codificar y decodificar una imagen binaria. El programa que vamos a crear hoy está pensado como un programa local independiente, pero puedes aplicarse a distintos conceptos como el envío de una imagen codificada desde tu dispositivo móvil a un servidor, y muchas otras aplicaciones.

¿Qué es la codificación Base64?

Antes de entrar en materia, vamos a definir lo que entendemos por Base64. El Base64 es la manera en que los datos binarios de 8 bits se codifican a un formato que pueda ser representado en 7 bits. Esto se hace utilizando sólo los caracteres A-Z, a-z, 0-9, +, y / con el fin de representar los datos. El caracter = lo utilizamos para los datos de pad. Por ejemplo, utilizando esta codificación, tres bytes de 8 bits se convierten en cuatro bytes de 7 bits.

El término base 64 viene del estándar Multipurpose Internet Mail Extensions (MIME), que es ampliamente utilizado para HTTP y XML, y fue desarrollado originalmente para la codificación de adjuntos de los correos electrónicos y su correcta transmisión.

¿Por qué utilizamos Base64?

Base64 es muy importante para la representación de datos binarios, tanto que permite que los datos binarios puedan ser representados de manera que parezcan y actúen como texto sin formato. Esto hace que sea más seguro almacenarlos en bases de datos, enviarlos a través de correo electrónico o utilizarlos en formatos basados en texto como XML. Base64 se utiliza básicamente para representar datos en formato ASCII.

Como hemos dicho en la introducción de este artículo, sin Base64 los datos no podrían ser leídos en absoluto.

La codificación Base64

La codificación Base64 es el proceso de convertir los datos binarios, en un juego de caracteres limitado a 64 caracteres. Como hemos dicho en la primera sección, esos caracteres son A-Z, a-z, 0-9, +, y / (¿Los has contado?, ¿te has dado cuenta de que se suman 64?). Este conjunto de caracteres se considera el conjunto de caracteres más común, y se conoce como el Base64 de MIME. Utiliza A-Z, a-z, 0-9, +, y / para los primeros 62 valores, y +, y / para los dos últimos valores.

Los datos codificados en Base64 terminan siendo más grandes que los datos originales, de manera que, como hemos dicho antes, por cada 3 bytes de datos binarios, hay al menos 4 bytes de datos codificados en Base64. Esto es debido al hecho de que estás apretando los datos en un conjunto más pequeño de caracteres.

¿Alguna vez has visto el bruto de un archivo de correo electrónico como el que muestro a continuación? Si es que sí, entonces has visto la codificación Base64 en acción.

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

La codificación en Base64 se lleva a cabo en varios pasos:

  • El texto que se va a codificar, se convierte en sus respectivos valores decimales, es decir, en su equivalente ASCII (es decir, a: 97, b: 98, etc.).
  • Los valores decimales obtenidos en la etapa anterior se convierten en sus equivalentes binarios (es decir, 97: 01100001).
  • Todos los equivalentes binarios se concatenan, obteniendo un gran conjunto de números binarios.
  • El gran conjunto de números binarios se divide en secciones iguales,. Cada sección debe contener sólo 6 bits.
  • Los conjuntos iguales de 6 bits se convierten en sus equivalentes decimales.
  • Por último, los equivalentes decimales se convierten en sus valores Base 64 (es decir, 4: E).

La decodificación Base64

La decodificación Base64 es lo contrario a la codificación Base64. En otras palabras, se lleva a cabo mediante la inversión de los pasos descritos en la sección anterior.

Por lo tanto, las etapas de decodificación Base64 se pueden describir como:

  • Cada carácter de la cadena se cambia a su valor Base64 decimal.
  • Los valores decimales obtenidos se convierten en sus equivalentes binarios.
  • Los dos primeros bits de los números binarios se truncan para cada uno de los números binarios obtenidos, y los conjuntos de 6 bits se combinan, formando una gran cadena de dígitos binarios.
  • La gran cadena de dígitos binarios obtenidos en el paso anterior se divide en grupos de 8 bits.
  • Los números binarios de 8 bits se convierten en sus equivalentes decimales.
  • Por último, los valores decimales obtenidos se convierten en sus equivalentes ASCII.

Codificando una imagen

Ahora, vamos ya al meollo de la cuestión. En esta sección, te voy a mostrar cómo podemos codificar en Base64 una imagen fácilmente utilizando Python. Me voy a valer de la siguiente imagen binaria para hacerlo. Antes que nada, deciros que el nombre de la imagen es deer.gif.

Lo primero que tenemos que hacer con el fin de utilizar Base64 en Python es importar el módulo de Base64:

import base64

Con el fin de codificar la imagen, simplemente vamos a utilizar la función base64.encodestring(s). Podemos hacer lo siguiente con el fin de codificar en Base64 nuestra imagen:

import base64 
image = open('deer.gif', 'rb') #open binary file in read mode
image_read = image.read()
image_64_encode = base64.encodestring(image_read)

Si deseas ver la salida del proceso de codificación, escribe lo siguiente:

print image_64_encode

Decodificando una imagen

Para decodificar una imagen utilizando Python, simplemente usamos la función base64.decodestring(s). Por lo tanto, con el fin de decodificar la imagen que codifican en la sección anterior, hacemos lo siguiente:

base64.decodestring(image_64_encode)

Poniéndolo todo junto

Vamos a poner el programa que codifica y decodifica una imagen en Base64 juntos. La secuencia de comandos de Python que hace esto debería ser algo como lo siguiente:

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') # create a writable image and write the decoding result
image_result.write(image_64_decode)

Y eso es todo. Como hemos podido ver, Python hace que sea muy sencillo de realizar lo que parece ser una tarea compleja.

Fuente: code.tutsplus.com

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP