C# helper methods to encode and decode Base64 values.
public static class Base64Url
{
public static string Encode(byte[] input)
{
var output = Convert.ToBase64String(input);
output = output.Split('=')[0]; // Remove any trailing '='s
output = output.Replace('+', '-'); // 62nd char of encoding
output = output.Replace('/', '_'); // 63rd char of encoding
return output;
}
public static byte[] Decode(string input)
{
var output = input;
output = output.Replace('-', '+'); // 62nd char of encoding
output = output.Replace('_', '/'); // 63rd char of encoding
switch (output.Length % 4) // Pad with trailing '='s
{
case 0:
break; // No pad chars in this case
case 2:
output += "==";
break; // Two pad chars
case 3:
output += "=";
break; // One pad char
default:
throw new ArgumentOutOfRangeException(
nameof(input), "Illegal base64url string!");
}
var converted = Convert.FromBase64String(output); // Standard base64 decoder
return converted;
}
}
// -------------------------------------------
// Usage
// -------------------------------------------
// Encode
var bytes1 = new byte[] { 72, 101, 108, 108, 111, 32, 66, 97, 115, 101, 54, 52, 85, 114, 108, 32, 101, 110, 99, 111, 100, 105, 110, 103, 33 };
var encodedString1 = Base64Url.Encode(bytes1);
WriteLine(encodedString1); // SGVsbG8gQmFzZTY0VXJsIGVuY29kaW5nIQ
// Decode
var encodedString2 = "SGVsbG8gQmFzZTY0VXJsIGVuY29kaW5nIQ";
var bytes2 = Base64Url.Decode(encodedString2);
WriteLine(System.Text.Encoding.UTF8.GetString(bytes2)); // Hello Base64Url encoding!
// ---------------------------------------------------------------------------
// or...
// ---------------------------------------------------------------------------
// From
// https://github.com/octokit/octokit.net/blob/master/Octokit/Helpers/StringExtensions.cs
public static string ToBase64String(this string input)
{
return Convert.ToBase64String(Encoding.UTF8.GetBytes(input));
}
// From
// https://github.com/octokit/octokit.net/blob/master/Octokit/Helpers/StringExtensions.cs
public static string FromBase64String(this string encoded)
{
var decodedBytes = Convert.FromBase64String(encoded);
return Encoding.UTF8.GetString(decodedBytes, 0, decodedBytes.Length);
}
// ---------------------------------------------------------------------------
// or...
// ---------------------------------------------------------------------------
using System;
using System.Text;
using System.Text.RegularExpressions;
//
// https://github.com/IdentityModel/Thinktecture.IdentityModel.45/blob/master/IdentityModel/Thinktecture.IdentityModel/Http/HeaderEncoding.cs
//
namespace Thinktecture.IdentityModel.Http
{
public static class HeaderEncoding
{
public static bool IsBase64Encoded(string token)
{
token = token.Trim();
return (token.Length % 4 == 0) &&
(Regex.IsMatch(token, @"^[a-zA-Z0-9+/]*={0,3}$", RegexOptions.None));
}
public static string EncodeBase64(string token)
{
Encoding encoding = Encoding.GetEncoding("iso-8859-1");
string encodedToken = Convert.ToBase64String(encoding.GetBytes(token));
return encodedToken;
}
public static string DecodeBase64(string token)
{
Encoding encoding = Encoding.GetEncoding("iso-8859-1");
string decodedToken = encoding.GetString(Convert.FromBase64String(token));
return decodedToken;
}
}
}