【.NET/C#】Base64とBase64 URLの相互変換(エンコード・デコード)

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

【.NET/C#】Base64とBase64 URLの相互変換(エンコード・デコード)

2022-8-8 | ,

.NETでBase64とBase64 URLを相互変換(エンコード・デコード)したい!

概要

今回の記事では、.NETでBase64とBase64 URLを相互変換(エンコード・デコード)する手順を掲載する。

Base64は、バイナリなどのデータを64種類の文字列で表現するエンコード方式です。

Base64 URLは、Base64から更にURLとして使える文字列で表現するエンコード方式です。具体的にはBase64にエンコードした文字列に下記の処理を行う。

  • +-に置換する
  • /_に置換する
  • 末尾の=を削除する

仕様書

環境

  • NET6.0

手順書

下記は、文字列をBase64にエンコードした後にBase64 URLにエンコードした文字列を返す関数です。

public string ToBase64UrlString(string s)
{
    return Convert.ToBase64String(Encoding.UTF8.GetBytes(s))
        .TrimEnd('=')
        .Replace('+', '-')
        .Replace('/', '_');
}

下記は、Base64 URLにエンコードされた文字列をBase64にデコードした後に元の文字列にデコードした文字列を返す関数です。

public string FromBase64UrlString(string s)
{
    for (int i = 0; i < (s.Length % 4); i++)
    {
        s += "=";
    }

    return Encoding.UTF8.GetString(
        Convert.FromBase64String(
            s.Replace('-', '+').Replace('_', '/')
        )
    );
}

Base64は、文字列の長さを4の倍数にする必要がある。下記のコードの部分で文字列の長さが4の倍数になってるか判定して4の倍数になってなければ、文字列の末尾に=を挿入して文字列の長さを調整してる。

    for (int i = 0; i < (s.Length % 4); i++)
    {
        s += "=";
    }

まとめ(感想文)

Base64でエンコードした文字列をそのままURLに使ってしまって、沼に沈みかけたのは良い思い出…。