【.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に使ってしまって、沼に沈みかけたのは良い思い出…。