jueves, 1 de mayo de 2014

Receta No. 2-4 en C#: Codificación de Datos Binarios a través de Base64

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica: Código Fuente C#
5. Notas Finales
6. Conclusiones
7. Glosario
8. Enlaces & Literatura

0. Introducción

Seguimos con la serie de recetas de manipulación de datos. En esta oportunidad vamos a tratar con otro artefacto que nos va a permitir codificar archivos (datos) binarios usando un esquema de codificación del tipo binario-a-texto conocido como Base64. Encontraremos su utilidad para la transmisión y almacenamiento de archivos en sistemas de información.

1. Problema

En una de las primeras etapas de prueba de métodos y mecanismos de representación de datos, se busca implementar una solución que facilite el almacenamiento y la transmisión datos binarios como una secuencia de caracteres codificados en ASCII.

2. Solución

El arquitecto de solución ha hallado que un método de codificación simple y confiable para representar archivos binarios como una secuencia de caracteres basados en ASCII es Base64 [2]. Y el Framework .NET posee un conjunto de métodos de la clase Convert para llevar a cabo esta tarea de manera fácil e intuitiva.

3. Discusión de la Solución

A los métodos que me refería arriba son:
  • Basados en arreglo de caracteres:
    • ToBase64CharArray [4]
    • FromBase64CharArray [5]
  • Basados en cadenas de caracteres:
    • ToBase64String [6]
    • FromBase64String [7]
Los primeros dos métodos permiten crear un arreglo de caracteres codificado en el esquema Base64 a partir de un archivo binario. Los dos últimos, permiten codificar una archivo binario a una secuencia de caracteres que utiliza el mismo esquema de codificación. Todos estos métodos, como se dijo en la sección anterior, pertenecen a la clase System.Convert [3].

Base64 internamente manipula la secuencia de bytes y al final del proceso de codificación genera una secuencia de caracteres (como una cadena de caracteres o un arreglo) basado en ASCII [8]. Esta representación final de archivos binarios, como nos indican en [1], es útil para incluir la secuencia de caracteres en un archivo de texto plano o en un correo electrónico. (Esto puede deberse a una restricción o incapacidad de la infraestructura o por directivas de la infraestructura de la compañía.)

En [1] igualmente nos advierten sobre el modo de funcionamiento de este algoritmo de codificación:
Base64 encoding works by spreading the contents of 3 bytes of input data across 4 bytes and ensuring each byte uses only the 7 low-order bits to containt data.
A través del ejemplo queda mejor plasmada esta definición:

Tomemos la cadena: Man
La codificamos con Base64 [9]TWFu

Cada carácter de Man en el esquema ASCII: 77, 97, y 110.
Valores binarios de cada decimal anterior: 01001101, 01100001, y 01101110

Se concatenan estos 3 bytes: 010011010110000101101110

Ahora se forman grupos de 6 bytes: 010011 010110 000101 101110

Utilizamos el siguiente índice de Base64:
Tabla de codificación de Base64
Figura 1. Tabla de codificación de Base64 [2].

Con lo cual obtenemos los equivalentes en decimal: 19, 22, 5, y 46.
Ahora mapeamos estos valores con el correspondiente valor literal: T, W, F, u.

En resumen:
Ejemplo codificación Base64("Man") = "TWFu"
Figura 2. Ejemplo codificación Base64("Man") = "TWFu" [2].

[Nota: Recomiendo la lectura de la sección 'Examples' en [2] para mayores detalles.]

Esta tarea se vuelve muy sencilla (por no decir que trivial) utilizando la clase Convert del namespace System. Empero, debemos considerar:

4. Práctica: Código Fuente C#

En esta parte práctica vamos a sacar provecho a los 4 métodos mencionados en las secciones anteriores para utilizar el esquema de codificación Base64 de la siguiente manera:
  • Codificación de decodificación de arreglo de bytes.
  • Codificación y decodificacion de tipos por valor.

Compilación:


  1. csc /target.exe CodificadorBase64.cs

> Prueba de ejecución.

Resultado mostrado en la salida estándar:

Codificación de datos binarios:
BENf/wDwLWJ4IhVRWtYMWTZjvcLVD4z1ygw=
Decodificación de datos binarios:
04-43-5F-FF-00-F0-2D-62-78-22-15-51-5A-D6-0C-59-36-63-BD-C2-D5-0F-8C-F5-CA-0C


Codificación de cadena caracteres:
"Experiencias Construcción Software (xCSw)"
 (Cadena caracteres) -> RQB4AHAAZQByAGkAZQBuAGMAaQBhAHMAIABDAG8AbgBzAHQAcgB1AGMAYwBpAPMAbgAgAFMAbwBmAHQAdwBhAHIAZQAgACgAeABDAFMAdwApAA== (Base64)
Decodificación de cadena caracteres:
RQB4AHAAZQByAGkAZQBuAGMAaQBhAHMAIABDAG8AbgBzAHQAcgB1AGMAYwBpAPMAbgAgAFMAbwBmAHQAdwBhAHIAZQAgACgAeABDAFMAdwApAA== (Base64) -> "Experiencias Construcción Software (xCSw)" (cadena de caracteres)


Codificación de un número decimal:
3.14159265358979 (decimal) -> "gyRq57kdAQAAAAAAAAAOAA==" (Base64)

Decodificación de un número decimal:
"gyRq57kdAQAAAAAAAAAOAA==" (Base64) -> 3.14159265358979
 (decimal)

Codificación de un número entero:
1313 (entero) -> "nTMAAA==" (Base64)

Decodificación de un número entero:
"nTMAAA==" (Base64) -> 13213 (entero)

5. Notas Finales

Vale agregar la siguiente advertencia declarada en [1]:
Advertencia de Base64 en mensajes de Email
Figura 3. Advertencia de Base64 en mensajes de email [1].

6. Conclusiones

Vimos que el esquema de codificación Base64 nos ofrecen un sistema de representación de datos binarios en cadenas de textos o arreglos binarios útil para el almacenamiento y la transmisión de datos binarios como archivos de texto o en un correo electrónico basados en ASCII. En la sección de Discusión de la Solución comprendimos el uso (básico) del algoritmo del esquema de codificación Base64. Al final, nos adentramos en un ejemplo para codificar datos binarios, cadenas de caracteres, números decimal y enteros usando Base64, y v.c.

7. Glosario

  • Algoritmo
  • Base64
  • Binario
  • Codificaicón
  • Conversión
  • Decimal
  • Decodificación
  • Entero

8. Enlaces & Literatura

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: Base64, the free encyclopedia - https://en.wikipedia.org/wiki/Base64
[3]: Convert Class (System) - http://msdn.microsoft.com/en-us/library/system.convert%28v=vs.110%29.aspx
[4]: Convert.ToBase64CharArray Method (System) - http://msdn.microsoft.com/en-us/library/system.convert.tobase64chararray%28v=vs.110%29.aspx
[5]: Convert.FromBase64CharArray Method (System) - http://msdn.microsoft.com/en-us/library/system.convert.frombase64chararray%28v=vs.110%29.aspx
[6]: Convert.ToBase64String Method (System) - http://msdn.microsoft.com/en-us/library/System.Convert.ToBase64String%28v=vs.110%29.aspx
[7]: Convert.FromBase64String Method (System) - http://msdn.microsoft.com/en-us/library/system.convert.frombase64string%28v=vs.110%29.aspx
[8]: ASCII, the free encyclopedia - https://en.wikipedia.org/wiki/ASCII
[9]: Receta No. 2-2 en C#: Codificar una Cadena de Caracteres usando Sistema de Codificación Alternativo | OrtizOL - Experiencias Construcción Software (xCSw) - http://ortizol.blogspot.com/2014/04/receta-no-2-2-en-c-codificar-una-cadena.html
[10]: Receta No. 2-3 en C#: Conversión de Tipos Numéricos a Arreglos de Bytes | OrtizOL - Experiencias Construcción Software (xCSw) - http://ortizol.blogspot.com/2014/04/receta-no-2-3-en-c-conversion-de-tipos.html


M

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.