// ===++===
//
// OrtizOL
//
// ===--===
/*============================================================
//
// Clase: CodificadorBase64.cs
//
// Propósito: Demostrar las capacidadese del esquema de
// codificación Base64.
//
============================================================*/
using System;
using System.Text;
namespace Recetas.Ch02
{
internal class CodificadorBase64
{
///
/// Punto de entrada a la aplicación
///
public static void Main()
{
// arreglo de datos binarios
byte[] datosBinarios = { 0x04, 0x43, 0x5F, 0xFF, 0x0, 0xF0, 0x2D, 0x62, 0x78,
0x22, 0x15, 0x51, 0x5A, 0xD6, 0x0C, 0x59, 0x36, 0x63, 0xBD, 0xC2, 0xD5,
0x0F, 0x8C, 0xF5, 0xCA, 0x0C};
// Asegura la divisilidad entre 4.
char[] datosEnBase64 = new char[(int)(Math.Ceiling((double) datosBinarios.Length / 3) * 4)];
// Presenta resultados en la salida estándar
Console.WriteLine("\nCodificación de datos binarios:");
Convert.ToBase64CharArray(datosBinarios, 0, datosBinarios.Length, datosEnBase64, 0);
Console.WriteLine(new String(datosEnBase64));
Console.WriteLine("Decodificación de datos binarios:");
Console.WriteLine(BitConverter.ToString(Convert.FromBase64CharArray(datosEnBase64, 0, datosEnBase64.Length)));
// Codificación de una cadena de caracteres
Console.WriteLine("\n\nCodificación de cadena caracteres:");
Console.WriteLine("{0} (Cadena caracteres) -> {1} (Base64)", "\"Experiencias Construcción Software (xCSw)\"\n", CadenaCaracteresABase64("Experiencias Construcción Software (xCSw)"));
Console.WriteLine("Decodificación de cadena caracteres:");
Console.WriteLine("{0} (Base64) -> \"{1}\" (cadena de caracteres)", "RQB4AHAAZQByAGkAZQBuAGMAaQBhAHMAIABDAG8AbgBzAHQAcgB1AGMAYwBpAPMAbgAgAFMAbwBmAHQAdwBhAHIAZQAgACgAeABDAFMAdwApAA==", Base64ACadenaCaracteres("RQB4AHAAZQByAGkAZQBuAGMAaQBhAHMAIABDAG8AbgBzAHQAcgB1AGMAYwBpAPMAbgAgAFMAbwBmAHQAdwBhAHIAZQAgACgAeABDAFMAdwApAA=="));
// Codificación de un número decimal
Console.WriteLine("\n\nCodificación de un número decimal:");
Console.WriteLine("{0} (decimal) -> \"{1}\" (Base64)\n", 3.14159265358979M, DecimalABase64(3.14159265358979M));
Console.WriteLine("Decodificación de un número decimal:");
Console.WriteLine("\"{0}\" (Base64) -> {1}\n (decimal)", "gyRq57kdAQAAAAAAAAAOAA==", Base64ADecimal("gyRq57kdAQAAAAAAAAAOAA=="));
// Codificación de un número decimal
Console.WriteLine("\nCodificación de un número entero:");
Console.WriteLine("{0} (entero) -> \"{1}\" (Base64)\n", 1313, EnteroABase64(13213));
Console.WriteLine("Decodificación de un número entero:");
Console.WriteLine("\"{0}\" (Base64) -> {1} (entero)", "nTMAAA==", Base64AEntero("nTMAAA=="));
}
///
/// Codifica una cadena de caracteres usando Base64
///
///Cadena de caracteres a codificar
///La cadena de caracteres codificada con Base64.
public static string CadenaCaracteresABase64(string cadena)
{
// Obtención binaria de la cadena
byte[] bytesCadena = Encoding.Unicode.GetBytes(cadena);
// Codificación usando Base64
return Convert.ToBase64String(bytesCadena);
}
///
/// Decodificación de una cadena de caracteres
///
///Cadena basada en Base64 a decodificar
///Cadena de caracteres decodificada.
public static string Base64ACadenaCaracteres(string cadena)
{
// Representación binaria de la cadena basada en Base64
byte[] bytes = Convert.FromBase64String(cadena);
// Decodificación
return Encoding.Unicode.GetString(bytes);
}
///
/// Codificación número decimal usando Base64
///
///Valor numérico punto flotante
///Número punto flotante codificado en Base64.
public static string DecimalABase64(decimal valor)
{
// Representación binaria del número decimal
byte[] bytes = DecimalAArregloBytes(valor);
// Codificación
return Convert.ToBase64String(bytes);
}
///
/// Decodificación de un número decimal a Base64
///
///Cadena que representa el número decimal codificado en Base64
///Número decimal decodificado.
public static decimal Base64ADecimal(string cadena)
{
// Decodificación
byte[] bytes = Convert.FromBase64String(cadena);
// Cadena decodificada en decimal
return ArregloBytesADecimal(bytes);
}
///
/// Codificación número entero usando Base64
///
///Valor numérico entero.
///Número entero codificado en Base64.
public static string EnteroABase64(int valor)
{
// Representación binaria
byte[] bytes = BitConverter.GetBytes(valor);
// Codificación
return Convert.ToBase64String(bytes);
}
///
/// Decodificación de un número entero a Base64
///
///Cadena que representa el número entero codificado en Base64
///Número entero decodificado.
public static int Base64AEntero(string cadena)
{
// Decodificación
byte[] bytes = Convert.FromBase64String(cadena);
// Entero
return BitConverter.ToInt32(bytes, 0);
}
///
/// Crea un arreglo de bytes a partir de un valor numérico de punto flotante
///
///Valor numérico punto flotante
///Arreglo de bytes que representa el valor numérico.
public static byte[] DecimalAArregloBytes(decimal valor)
{
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
using (System.IO.BinaryWriter bw = new System.IO.BinaryWriter(ms))
{
// Escribe el valor punto flotante sobre el BinaryWriter
bw.Write(valor);
return ms.ToArray();
}
}
}
///
/// Convierte un arreglo de bytes a un valor punto flotante
///
///Arreglo de bytes
///Valor punto flotante.
public static decimal ArregloBytesADecimal(byte[] bytes)
{
using(System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes))
{
using(System.IO.BinaryReader br = new System.IO.BinaryReader(ms))
{
return br.ReadDecimal();
}
}
}
}
}