// ===++=== // // 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(); } } } } }