Base64 Encoding & Decoding in C# (.NET)

C# provides Convert.ToBase64String() and Convert.FromBase64String() in the standard library. .NET 5+ also added Base64Url helpers and span-based APIs for zero-allocation encoding.

Basic Usage

using System;
using System.Text;

// Encode string to Base64
string original = "Hello, world!";
byte[] bytes = Encoding.UTF8.GetBytes(original);
string encoded = Convert.ToBase64String(bytes);
Console.WriteLine(encoded); // "SGVsbG8sIHdvcmxkIQ=="

// Decode Base64 to string
byte[] decodedBytes = Convert.FromBase64String(encoded);
string decoded = Encoding.UTF8.GetString(decodedBytes);
Console.WriteLine(decoded); // "Hello, world!"

Always use Encoding.UTF8 explicitly when converting strings to bytes. Avoid Encoding.Default which varies by platform.

Line-Breaking Options

// No line breaks (default, recommended for most uses)
string noBreaks = Convert.ToBase64String(bytes, Base64FormattingOptions.None);

// Insert line breaks every 76 characters (MIME format)
string withBreaks = Convert.ToBase64String(bytes, Base64FormattingOptions.InsertLineBreaks);

URL-Safe Base64 (.NET 7+)

// .NET 7+ has a dedicated Base64Url helper
using System.Buffers.Text;

// Or use Microsoft.AspNetCore.WebUtilities (available in earlier .NET)
using Microsoft.AspNetCore.WebUtilities;

string encoded = WebEncoders.Base64UrlEncode(bytes);
byte[] decoded = WebEncoders.Base64UrlDecode(encoded);

For older .NET versions without Base64Url, implement it manually:

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

public static byte[] FromBase64Url(string base64url)
{
    string base64 = base64url
        .Replace('-', '+')
        .Replace('_', '/');
    // Restore padding
    int pad = base64.Length % 4;
    if (pad == 2) base64 += "==";
    else if (pad == 3) base64 += "=";
    return Convert.FromBase64String(base64);
}

Encoding Files

using System.IO;

// Encode file to Base64 string
string encoded = Convert.ToBase64String(File.ReadAllBytes("image.png"));

// Decode Base64 back to file
File.WriteAllBytes("output.png", Convert.FromBase64String(encoded));

Stream-Based Encoding (.NET)

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

// Encode stream to Base64 (for large files)
public static void EncodeToBase64Stream(Stream input, TextWriter output)
{
    using var toBase64 = new ToBase64Transform();
    byte[] inputBuffer = new byte[3 * 1024]; // multiples of 3 for clean chunks
    byte[] outputBuffer = new byte[4 * 1024];
    int bytesRead;
    while ((bytesRead = input.Read(inputBuffer, 0, inputBuffer.Length)) > 0)
    {
        int written = toBase64.TransformBlock(
            inputBuffer, 0, bytesRead, outputBuffer, 0);
        output.Write(Encoding.ASCII.GetString(outputBuffer, 0, written));
    }
    byte[] final = toBase64.TransformFinalBlock(inputBuffer, 0, 0);
    output.Write(Encoding.ASCII.GetString(final));
}

Span-Based API (.NET 5+)

For high-performance scenarios, use the span-based APIs to avoid heap allocations:

using System;
using System.Text;

// Zero-allocation encoding into a pre-allocated buffer
byte[] inputBytes = Encoding.UTF8.GetBytes("Hello, world!");

int outputLength = ((inputBytes.Length + 2) / 3) * 4;
Span<char> output = stackalloc char[outputLength];

bool success = Convert.TryToBase64Chars(inputBytes, output, out int charsWritten);
if (success)
{
    Console.WriteLine(new string(output[..charsWritten]));
}

Validating Base64 Input

public static bool IsValidBase64(string s)
{
    if (string.IsNullOrEmpty(s)) return false;
    // Length must be multiple of 4
    if (s.Length % 4 != 0) return false;
    try
    {
        Convert.FromBase64String(s);
        return true;
    }
    catch (FormatException)
    {
        return false;
    }
}

Verify your C# Base64 output

Copy the encoded string from your .NET application and paste it into base64.dev to decode it instantly.

Open base64.dev →