本日は 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); } }