121

データをbase64エンコードしてURLに入れ、HttpHandler内でデコードしたいと思います。

Base64エンコーディングでは、UriTemplateの一致を台無しにする「/」文字が許可されていることがわかりました。次に、ウィキペディアから「URL用に変更されたBase64」の概念があることがわかりました。

URLバリアント用に変更されたBase64が存在し、パディング'='は使用されず、標準Base64の'+'および'/'文字はそれぞれ'-'および'_'に置き換えられるため、URLエンコーダー/デコーダーを使用しますは不要になり、エンコードされた値の長さに影響を与えず、リレーショナルデータベース、Webフォーム、および一般的なオブジェクト識別子で使用するために同じエンコードされたフォームをそのまま残します。

.NETを使用して、現在のコードを基本的なbase64のエンコードとデコードから、「URL用に変更されたbase64」メソッドを使用するように変更したいと思います。誰かがこれをしましたか?

デコードするために、私はそれが次のようなもので始まることを知っています:

string base64EncodedText = base64UrlEncodedText.Replace('-', '+').Replace('_', '/');

// Append '=' char(s) if necessary - how best to do this?

// My normal base64 decoding now uses encodedText

ただし、最後に1つまたは2つの'='文字を追加する必要があります。これは、もう少し複雑に見えます。

私のエンコーディングロジックはもう少し単純なはずです:

// Perform normal base64 encoding
byte[] encodedBytes = Encoding.UTF8.GetBytes(unencodedText);
string base64EncodedText = Convert.ToBase64String(encodedBytes);

// Apply URL variant
string base64UrlEncodedText = base64EncodedText.Replace("=", String.Empty).Replace('+', '-').Replace('/', '_');

URLStackOverflowエントリのGuidtoBase64を見たことがありますが、これは既知の長さであるため、最後に必要な等号の数をハードコーディングできます。

4

5 に答える 5

179

また、URLセーフなBase64エンコードおよびデコードを処理するUrlTokenEncodeメソッドとUrlTokenDecodeメソッドを使用してクラスHttpServerUtilityを確認します。

注1:結果は有効なBase64文字列ではありません。URLの一部の安全でない文字が置き換えられます。

注2:結果はRFC4648のbase64urlアルゴリズムとは異なり、クエリパラメータの値を安全にするために置き換えた等号の数に応じて、「=」パディングを「0」、「1」、または「2」に置き換えます。

///<summary>
/// Base 64 Encoding with URL and Filename Safe Alphabet using UTF-8 character set.
///</summary>
///<param name="str">The origianl string</param>
///<returns>The Base64 encoded string</returns>
public static string Base64ForUrlEncode(string str)
{
    byte[] encbuff = Encoding.UTF8.GetBytes(str);
    return HttpServerUtility.UrlTokenEncode(encbuff);
}
///<summary>
/// Decode Base64 encoded string with URL and Filename Safe Alphabet using UTF-8.
///</summary>
///<param name="str">Base64 code</param>
///<returns>The decoded string.</returns>
public static string Base64ForUrlDecode(string str)
{
    byte[] decbuff = HttpServerUtility.UrlTokenDecode(str);
    return Encoding.UTF8.GetString(decbuff);
}
于 2009-11-24T10:26:39.547 に答える
79

これはそれを正しく埋めるはずです:-

 base64 = base64.PadRight(base64.Length + (4 - base64.Length % 4) % 4, '=');
于 2009-08-04T17:06:33.223 に答える
36

コメントするのに十分なポイントはありませんが、役立つ場合は、提供されたリンク(JSON Web署名ietfドラフト)でSushilが見つけたコードスニペットは、Base64をURLのパラメーターとしてエンコードするときに機能します。

怠惰な人のために以下のスニペットをコピーしました:

    static string Base64UrlEncode(byte[] arg)
    {
        string s = Convert.ToBase64String(arg); // Regular base64 encoder
        s = s.Split('=')[0]; // Remove any trailing '='s
        s = s.Replace('+', '-'); // 62nd char of encoding
        s = s.Replace('/', '_'); // 63rd char of encoding
        return s;
    }

    static byte[] Base64UrlDecode(string arg)
    {
        string s = arg;
        s = s.Replace('-', '+'); // 62nd char of encoding
        s = s.Replace('_', '/'); // 63rd char of encoding
        switch (s.Length % 4) // Pad with trailing '='s
        {
            case 0: break; // No pad chars in this case
            case 2: s += "=="; break; // Two pad chars
            case 3: s += "="; break; // One pad char
            default: throw new System.Exception(
              "Illegal base64url string!");
        }
        return Convert.FromBase64String(s); // Standard base64 decoder
    }
于 2015-10-13T22:40:00.347 に答える
21

質問で説明されているように、base64と少し異なるbase64urlエンコーディングのエンコード/デコードを行うコードを探しているときにここにヒットしました。

このドキュメントでc#コードスニペットが見つかりました。JSONWeb署名ietfドラフト

于 2013-01-16T08:23:14.160 に答える
5

受け入れられた答えと比較して、C#を使用してbase64エンコードされたURLを基本的にデコードする方法は次のとおりです。

デコード:

string codedValue = "base64encodedUrlHere";

string decoded;
byte[] buffer =  Convert.FromBase64String(codedValue);
decoded = Encoding.UTF8.GetString(buffer);
于 2016-01-07T01:40:04.510 に答える