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 →