Base64 en C#: cómo codificar y decodificar cadenas sin dolor de cabeza
\n\n¿Alguna vez te has encontrado en una situación donde necesitas transmitir datos binarios a través de un protocolo de texto, enviar una imagen en JSON o guardar un hash en un formato legible? Aquí es donde entra en escena Base64: el viejo, confiable y seguro formato que convierte cualquier byte en texto seguro.
\n\nLa pregunta "How do I encode and decode a base64 string?" es una de las más populares en Stack Overflow (decenas de miles de visitas). Y con razón: en C# trabajar con Base64 parece simple, pero hay trampas en cada esquina. Hoy analizaremos todo de principio a fin: desde ejemplos básicos hasta casos reales de producción.
\n\n¿Qué es Base64 y para qué sirve?
\n\nBase64 es una forma de representar datos binarios (bytes) como una cadena ASCII. El alfabeto consta de 64 caracteres: A-Z, a-z, 0-9, más los caracteres '+' y '/'. Al final de la cadena a menudo se agrega el carácter '=' para alineación.
\n\n¿Dónde se aplica?
\n- \n
- Transmisión de datos en JSON/XML — los datos binarios no se pueden insertar directamente, solo como cadena \n
- Autenticación — Basic Auth usa Base64 para codificar el nombre de usuario y la contraseña \n
- Almacenamiento de imágenes en BD — las imágenes pequeñas se guardan directamente en la base de datos como Base64 \n
- Archivos adjuntos de correo electrónico — el formato MIME requiere Base64 para archivos binarios \n
En C#, todo esto lo maneja la clase System.Convert — tu herramienta principal para trabajar con Base64.
Cómo codificar una cadena en Base64 con C#
\n\nEl escenario más común: tienes una cadena normal (por ejemplo, "¡Hola, mundo!") y quieres obtener su representación en Base64.
Así es como se hace:
\n\nusing System;\nusing System.Text;\n\nstring original = "Hello, World!";\nbyte[] bytes = Encoding.UTF8.GetBytes(original);\nstring base64 = Convert.ToBase64String(bytes);\n\nConsole.WriteLine(base64); // Salida: SGVsbG8sIFdvcmxkIQ==\n\nUn punto importante: Base64 trabaja con bytes, no con cadenas. Por lo tanto, primero convertimos la cadena en un arreglo de bytes (usando la codificación UTF-8) y luego codificamos esos bytes.
\n\n¿Por qué UTF-8 y no, por ejemplo, ASCII? Porque UTF-8 admite todos los caracteres Unicode, incluidos cirílico, jeroglíficos y emojis. Si usas ASCII para cadenas en español, los datos se perderán.
\n\nCómo decodificar Base64 de vuelta a una cadena
\n\nEl proceso inverso — la decodificación — se ve así:
\n\nusing System;\nusing System.Text;\n\nstring base64 = "SGVsbG8sIFdvcmxkIQ==";\nbyte[] bytes = Convert.FromBase64String(base64);\nstring decoded = Encoding.UTF8.GetString(bytes);\n\nConsole.WriteLine(decoded); // Salida: Hello, World!\n\nTen en cuenta: si codificaste la cadena en UTF-8, también debes decodificarla en UTF-8. De lo contrario, obtendrás caracteres extraños.
\n\nTrabajo con datos binarios (imágenes, archivos)
\n\nBase64 no se limita a cadenas. Puedes codificar cualquier dato binario, por ejemplo, una imagen o un PDF.
\n\nEjemplo: codificamos un arreglo de bytes en Base64
\n\nbyte[] imageBytes = File.ReadAllBytes("photo.jpg");\nstring base64Image = Convert.ToBase64String(imageBytes);\n\n// Ahora puedes guardar la cadena en JSON o enviarla por API\nConsole.WriteLine($"Longitud de la cadena Base64: {base64Image.Length} caracteres");\n\nDecodificamos de vuelta a un archivo:
\n\nstring base64Image = "..."; // tu cadena\nbyte[] imageBytes = Convert.FromBase64String(base64Image);\nFile.WriteAllBytes("decoded_photo.jpg", imageBytes);\n\nImportante: Base64 aumenta el tamaño de los datos aproximadamente un 33%. Si tienes una imagen de 1 MB, después de la codificación pesará ~1.33 MB como cadena.
\n\nErrores típicos y cómo evitarlos
\n\nIncluso los desarrolladores experimentados a veces tropiezan con Base64. Estos son los errores más comunes:
\n\n