Base64 Encoding in C#

C# provides Base64 encoding through the System.Convert class.

Basic Usage

Encode to Base64

using System;
using System.Text;

string text = "Hello, World!";
byte[] bytes = Encoding.UTF8.GetBytes(text);
string encoded = Convert.ToBase64String(bytes);
Console.WriteLine(encoded); // "SGVsbG8sIFdvcmxkIQ=="

Decode from Base64

using System;
using System.Text;

string encoded = "SGVsbG8sIFdvcmxkIQ==";
byte[] bytes = Convert.FromBase64String(encoded);
string decoded = Encoding.UTF8.GetString(bytes);
Console.WriteLine(decoded); // "Hello, World!"

URL-Safe Base64

C# doesn't have built-in URL-safe Base64, but it's easy to implement:

using System;
using System.Text;

public static class Base64Url
{
    public static string Encode(string input)
    {
        var bytes = Encoding.UTF8.GetBytes(input);
        return Convert.ToBase64String(bytes)
            .Replace('+', '-')
            .Replace('/', '_')
            .TrimEnd('=');
    }

    public static string Decode(string input)
    {
        string base64 = input.Replace('-', '+').Replace('_', '/');
        switch (base64.Length % 4)
        {
            case 2: base64 += "=="; break;
            case 3: base64 += "="; break;
        }
        var bytes = Convert.FromBase64String(base64);
        return Encoding.UTF8.GetString(bytes);
    }
}

// Usage
string encoded = Base64Url.Encode("Hello, World!");
string decoded = Base64Url.Decode(encoded);

File to Base64

Encode a File

using System;
using System.IO;

byte[] bytes = File.ReadAllBytes("image.png");
string encoded = Convert.ToBase64String(bytes);
Console.WriteLine(encoded);

Decode to File

using System;
using System.IO;

string encoded = "iVBORw0KGgo..."; // Base64 string
byte[] bytes = Convert.FromBase64String(encoded);
File.WriteAllBytes("output.png", bytes);

With Line Breaks (MIME)

Insert line breaks for MIME compatibility:

using System;
using System.Text;

string text = "Hello, World!";
byte[] bytes = Encoding.UTF8.GetBytes(text);

// Insert line breaks every 76 characters
string encoded = Convert.ToBase64String(bytes, Base64FormattingOptions.InsertLineBreaks);
Console.WriteLine(encoded);

Streaming Large Files

For large files, use streams:

using System;
using System.IO;
using System.Security.Cryptography;

// Encode file to Base64
using (var inputStream = File.OpenRead("input.bin"))
using (var outputStream = File.Create("output.txt"))
using (var base64Stream = new CryptoStream(outputStream, new ToBase64Transform(), CryptoStreamMode.Write))
{
    inputStream.CopyTo(base64Stream);
}

// Decode Base64 to file
using (var inputStream = File.OpenRead("input.txt"))
using (var base64Stream = new CryptoStream(inputStream, new FromBase64Transform(), CryptoStreamMode.Read))
using (var outputStream = File.Create("output.bin"))
{
    base64Stream.CopyTo(outputStream);
}

Validation

Check if a string is valid Base64:

using System;

public static bool IsValidBase64(string input)
{
    if (string.IsNullOrEmpty(input)) return false;

    try
    {
        Convert.FromBase64String(input);
        return true;
    }
    catch (FormatException)
    {
        return false;
    }
}

Console.WriteLine(IsValidBase64("SGVsbG8=")); // true
Console.WriteLine(IsValidBase64("Invalid!!!")); // false

.NET 5+ Span-based

For better performance in .NET 5+:

using System;
using System.Buffers.Text;

// Encode
Span<byte> source = stackalloc byte[] { 72, 101, 108, 108, 111 }; // "Hello"
Span<byte> destination = stackalloc byte[8];
Base64.EncodeToUtf8(source, destination, out _, out _);

// Decode
Base64.DecodeFromUtf8(destination, source, out _, out _);