How do I encode and decode a base64 string in C#?

Here’s a comprehensive guide to Base64 encoding and decoding in C#, including advanced scenarios, error handling, and practical examples:

1. Understanding Base64

Base64 is a binary-to-text encoding scheme that converts binary data into an ASCII string format. It’s commonly used to:

  • Embed binary data in JSON/XML
  • Transmit binary over text-only protocols (e.g., HTTP)
  • Store binary files in databases as text

2. Encoding Strings to Base64

Basic String Encoding

using System;
using System.Text;

string original = "C# Base64 Guide! 🚀";
byte[] utf8Bytes = Encoding.UTF8.GetBytes(original);
string base64 = Convert.ToBase64String(utf8Bytes);

Console.WriteLine(base64); // QyMgQmFzZTY0IEd1aWRlISDwn4yA

Different Encodings

// ASCII Encoding (non-ASCII characters will be lost)
string asciiBase64 = Convert.ToBase64String(Encoding.ASCII.GetBytes("çáñ"));

// Unicode (UTF-16)
string unicodeBase64 = Convert.ToBase64String(Encoding.Unicode.GetBytes("Hello"));

3. Decoding Base64 to Strings

Basic Decoding

string base64String = "UGFydHkgUG9vcGVyIQ==";
byte[] decodedBytes = Convert.FromBase64String(base64String);
string decodedString = Encoding.UTF8.GetString(decodedBytes);

Console.WriteLine(decodedString); // Party Pooper!

Handling Different Encodings

// Decoding UTF-16 encoded string
byte[] unicodeBytes = Convert.FromBase64String("SABlAGwAbABvAA==");
string unicodeString = Encoding.Unicode.GetString(unicodeBytes); // "Hello"

4. File Operations

Image to Base64

// Encode image
byte[] imageBytes = File.ReadAllBytes("logo.png");
string imageBase64 = Convert.ToBase64String(imageBytes);

// Decode and save
File.WriteAllBytes("decoded_logo.png", Convert.FromBase64String(imageBase64));

Text File Roundtrip

// Encode text file
string textContent = File.ReadAllText("document.txt");
string textBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(textContent));

// Decode and save
string decodedText = Encoding.UTF8.GetString(Convert.FromBase64String(textBase64));
File.WriteAllText("decoded_doc.txt", decodedText);

5. Error Handling

Catching Invalid Base64

try
{
    byte[] data = Convert.FromBase64String("Invalid_Base64!!");
}
catch (FormatException ex)
{
    Console.WriteLine($"Error: {ex.Message}");
}

Validation Method

public static bool IsValidBase64(string input)
{
    Span<byte> buffer = new Span<byte>(new byte[input.Length]);
    return Convert.TryFromBase64String(input, buffer, out _);
}

// Usage
Console.WriteLine(IsValidBase64("SGVsbG8=")); // True
Console.WriteLine(IsValidBase64("Invalid!")); // False

6. URL-Safe Base64

Encoding/Decoding URL-Safe Strings

// Encode with URL-safe characters
string standardBase64 = "A+Z/Cz==";
string urlSafe = standardBase64
    .Replace('+', '-')
    .Replace('/', '_')
    .TrimEnd('=');

// Decode URL-safe
string standard = urlSafe
    .Replace('-', '+')
    .Replace('_', '/');
switch (standard.Length % 4) // Add padding
{
    case 2: standard += "=="; break;
    case 3: standard += "="; break;
}
byte[] data = Convert.FromBase64String(standard);

7. Advanced Helper Class

using System;
using System.IO;
using System.Text;

public static class Base64Helper
{
    // String Encoding
    public static string EncodeString(string input, Encoding encoding = null)
    {
        encoding ??= Encoding.UTF8;
        return Convert.ToBase64String(encoding.GetBytes(input));
    }

    // File Encoding
    public static string EncodeFile(string filePath)
    {
        byte[] fileBytes = File.ReadAllBytes(filePath);
        return Convert.ToBase64String(fileBytes);
    }

    // URL-Safe Encoding
    public static string EncodeUrlSafe(byte[] data)
    {
        return Convert.ToBase64String(data)
            .Replace('+', '-')
            .Replace('/', '_')
            .TrimEnd('=');
    }

    // Comprehensive Decoding
    public static byte[] Decode(string base64String)
    {
        try
        {
            return Convert.FromBase64String(base64String);
        }
        catch (FormatException)
        {
            // Handle invalid Base64 here
            return Array.Empty<byte>();
        }
    }
}

8. Performance Considerations

  1. Large Files: Use streaming for memory efficiency:
   using (FileStream input = File.OpenRead("largefile.zip"))
   using (MemoryStream output = new MemoryStream())
   {
       using (CryptoStream crypto = new CryptoStream(
           output, new ToBase64Transform(), CryptoStreamMode.Write))
       {
           input.CopyTo(crypto);
       }
       string base64Result = Encoding.ASCII.GetString(output.ToArray());
   }
  1. Memory Usage: Base64 increases data size by ~33%. Consider compression before encoding for large datasets.

9. Practical Examples

API Request with Base64

var payload = new {
    ImageData = Base64Helper.EncodeFile("photo.jpg"),
    Message = Base64Helper.EncodeString("Secret Message", Encoding.ASCII)
};
// Send as JSON to web service

Database Storage

// Store
string pdfBase64 = Base64Helper.EncodeFile("contract.pdf");
// Retrieve
byte[] pdfBytes = Base64Helper.Decode(pdfBase64);
File.WriteAllBytes("restored_contract.pdf", pdfBytes);

10. Common Pitfalls

  1. Encoding Mismatch:
   // Wrong: Using ASCII to decode UTF-16 encoded data
   string error = Encoding.ASCII.GetString(Convert.FromBase64String("SABlAGwAbABvAA=="));
   // Result: "H e l l o " (garbled)
  1. Missing Padding:
   // Fix missing padding
   string input = "SGVsbG8";
   input += new string('=', (4 - input.Length % 4) % 4);
   byte[] fixedData = Convert.FromBase64String(input);

Summary Table

OperationMethodExample Use Case
String EncodingConvert.ToBase64String()API authentication headers
Binary DecodingConvert.FromBase64String()Image processing pipelines
URL-Safe ConversionCharacter replacementJWT tokens in URLs
File OperationsFile.ReadAllBytes() + Base64Database BLOB storage
ValidationTryFromBase64String()User input sanitization

This guide covers essential and advanced Base64 operations in C#. Test these examples in a .NET Fiddle or console application to see them in action!

Leave a Reply

Your email address will not be published. Required fields are marked *