MRが楽しい

MRやVRについて学習したことを書き残す

C#で文字列をbase64URLでエンコード/デコードする

本日は C# の小ネタ枠です。
C#で文字列をbase64URLでエンコード/デコードする方法を記事に残します。

base64エンコード

64種類の英数字のみを用いてマルチバイト文字やバイナリデータを扱うエンコード方式です。
元データを6ビット毎に分割し、変換表に従って文字に変換します。文字数が4の倍数に満たない場合はパディングします。
このとき、A–Z, a–z, 0–9 までの 62 文字と、+, / の2つの記号が用いられます。
また文字数が4の倍数に満たないパディング部分は = の記号で埋められます。

base64URLエンコード

base64エンコードをURLで使用できるようにしたエンコード方式です。
URLでは特別な意味を持つ + や / の文字を別の文字に置き換えて利用しません。

変換前 変換後
+ -
/ _

パディング部分(=)は省略されます。

サンプルコード

上記の変換規則に基づき、作成したbase64URLの変換コードです。
・Base64URLConverter.cs

public class Base64URLConverter
{
    /// <summary>
    /// バイトデータをBase64URLに変換する
    /// </summary>
    /// <param name="bytes"></param>
    /// <returns></returns>
    public static string BytesToBase64URL(byte[] bytes)
    {
        // バイトデータをBase64に変換してから、Base64URLに変換する
        string base64 = System.Convert.ToBase64String(bytes);
        // + を - に、/ を _ に置換して = を削除する
        return base64.Replace('+', '-').Replace('/', '_').Replace("=", "");
    }
    
    /// <summary>
    /// Base64URLをバイトデータに変換する
    /// </summary>
    /// <param name="base64URL"></param>
    /// <returns></returns>
    public static byte[] Base64URLToBytes(string base64URL)
    {
        // Base64URLをBase64に変換してから、バイトデータに変換する
        // - を + に、_ を / に置換して = を補完する
        string base64 = base64URL.Replace('-', '+').Replace('_', '/');
        int mod = base64.Length % 4;
        if (mod != 0) base64 += new string('=', 4 - mod);
        
        return System.Convert.FromBase64String(base64);
    }
}

参考サイト

qiita.com