PyMOTW: base64

28 Julio 2008

Traducción de PyMOTW: base64 el módulo base64 de la columna semanal de Doug Hellmann.


Comentarios

El módulo base64 contiene funciones para traducir datos binarios a un sub conjunto de ASCII adecuado para la transmisión usando protocolos de texto plano.

Módulo base64
Propósito Codificar datos binarios en caracteres ASCII.
Versión de Python 1.4 y posterior

Descripción:

Las codificaciones base64, base32 y base16 convierten bytes de 8 bits en valores con 6, 5 o 4 bits de datos útiles por byte, permitiendo codificar bytes que no son ASCII como caracteres ASCII para su transmisión mediante protocolos que requieren ASCII plano, como SMTP. Los valores "base" corresponden a la longitud del alfabeto usado en cada codificación. Existen también variaciones de URL seguro de las codificaciones originales que usan resultados ligeramente diferentes.

Codificación base 64:

Un ejemplo básico de codificación de un texto:

import base64

initial_data = open(__file__, 'rt').read()

encoded_data = base64.b64encode(initial_data)

num_initial = len(initial_data)
padding = { 0:0, 1:2, 2:1 }[num_initial % 3]

print '%d bytes antes de la codificación' % num_initial
print 'Espera %d bytes de relleno' % padding
print '%d bytes después de la codificación' % len(encoded_data)
print
print encoded_data

El resultado muestra que 566 bytes de la fuente original se expanden a 756 bytes después de ser codificados. El proceso de codificación busca cada secuencia de 24 bits de entrada (3 bytes) y codifica esos mismos 24 esparcidos en 4 bytes de salida. Los dos últimos caracteres, el "=", es relleno porque el número de bits en la cadena original no era divisible por 24.

No hay retornos en el resultado producido por la librería, pero los he insertado en el resultado aquí para hacer que esta página aparezca más clara en HTML.

$ python base64_b64encode.py
566 bytes antes de la codificación
Espera 1 bytes de relleno
756 bytes después de la codificación

IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMgZW5jb2Rpbmc
6IHV0Zi04CiMKIyBDb3B5cmlnaHQgKGMpIDIwMDggRG
91ZyBIZWxsbWFubiBBbGwgcmlnaHRzIHJlc2VydmVkL
gojCiIiIgoiIiIKCl9fdmVyc2lvbl9fID0gIiRJZDog
YmFzZTY0X2I2NGVuY29kZS5weSAxNTI2IDIwMDgtMDc
tMjAgMTM6MjU6NDhaIGRoZWxsbWFubiAkIgoKaW1wb3
J0IGJhc2U2NAoKaW5pdGlhbF9kYXRhID0gb3BlbihfX
2ZpbGVfXywgJ3J0JykucmVhZCgpCgplbmNvZGVkX2Rh
dGEgPSBiYXNlNjQuYjY0ZW5jb2RlKGluaXRpYWxfZGF
0YSkKCm51bV9pbml0aWFsID0gbGVuKGluaXRpYWxfZG
F0YSkKcGFkZGluZyA9IHsgMDowLCAxOjIsIDI6MSB9W
251bV9pbml0aWFsICUgM10KCnByaW50ICclZCBieXRl
cyBhbnRlcyBkZSBsYSBjb2RpZmljYWNpw7NuJyAlIG5
1bV9pbml0aWFsCnByaW50ICdFc3BlcmEgJWQgYnl0ZX
MgZGUgcmVsbGVubycgJSBwYWRkaW5nCnByaW50ICclZ
CBieXRlcyBkZXNwdcOpcyBkZSBsYSBjb2RpZmljYWNp
w7NuJyAlIGxlbihlbmNvZGVkX2RhdGEpCnByaW50CnB
yaW50IGVuY29kZWRfZGF0YQo=

Decodificación base 64:

La cadena codificada puede ser convertida de vuelta a la forma original tomando 4 bytes y convirtiéndolos a los 3 originales, usando una búsqueda inversa. La función b64decode() hace éso para ti.

import base64

original_string = 'Éstos son los datos, en claro.'
print 'Original     :', original_string

encoded_string = base64.b64encode(original_string)
print 'Codificado   :', encoded_string

decoded_string = base64.b64decode(encoded_string)
print 'Decodificado :', decoded_string

$ python base64_b64decode.py
Original     : Éstos son los datos, en claro.
Codificado   : w4lzdG9zIHNvbiBsb3MgZGF0b3MsIGVuIGNsYXJvLg==
Decodificado : Éstos son los datos, en claro.

Variaciones de URL seguro:

Debido a que el alfabeto base64 por defecto puede usar + y /, y porque esos dos caracteres son usados en URLs, se hizo necesario especificar una codificación alternativa con sustitutos para esos caracteres. El + es reemplazado con un - y / es remplazado con la barra baja (_). Por lo demás, el alfabeto es el mismo.

import base64

for original in [ '\xfb\xef', '\xff\xff' ]:
    print 'Original                   :', repr(original)
    print 'Codificación estándar     :', base64.standard_b64encode(original)
    print 'Codificación de URL seguro :', base64.urlsafe_b64encode(original)
    print

$ python base64_urlsafe.py
Original                   : '\xfb\xef'
Codificación estándard     : ++8=
Codificación de URL seguro : --8=

Original                   : '\xff\xff'
Codificación estándard     : //8=
Codificación de URL seguro : __8=

Otras codificaciones:

Además de base 64, el módulo proporciona funciones para trabajar con datos codificados con base 32 y base 16.

import base64

original_string = 'Éstos son los datos, en claro.'
print 'Original     :', original_string

encoded_string = base64.b32encode(original_string)
print 'Codificado   :', encoded_string

decoded_string = base64.b32decode(encoded_string)
print 'Decodificado :', decoded_string

$ python base64_base32.py
Original     : Éstos son los datos, en claro.
Codificado   : YOEXG5DPOMQHG33OEBWG64ZAMRQXI33TFQQGK3RAMNWGC4TPFY======
Decodificado : Éstos son los datos, en claro.

Las funciones base 16 trabajan con el alfabeto hexadecimal.

import base64

original_string = 'Éstos son los datos, en claro.'
print 'Original     :', original_string

encoded_string = base64.b16encode(original_string)
print 'Codificado   :', encoded_string

decoded_string = base64.b16decode(encoded_string)
print 'Decodificado :', decoded_string

$ python base64_base16.py
Original     : Éstos son los datos, en claro.
Codificado   : C38973746F7320736F6E206C6F73206461746F732C20656E20636C61726F2E
Decodificado : Éstos son los datos, en claro.

Referencias:

RFC 3548 - The Base16, Base32, and Base64 Data Encodings
Python Module of the Week Home
Descarga el código

Copyright 2008 Doug Hellmann


blog comments powered by Disqus

Categorías