代码之家  ›  专栏  ›  技术社区  ›  Kirk Liemohn

用于解码/编码修改后的base64 url的代码

  •  106
  • Kirk Liemohn  · 技术社区  · 17 年前

    我希望base64对数据进行编码,将其放入一个URL中,然后在httphandler中对其进行解码。

    我发现了 Base64 Encoding 允许使用一个“/”字符,这会破坏我的uritemplate匹配。然后我发现维基百科有一个“为url修改base64”的概念:

    存在URL变量的修改base64,其中不使用填充“=”,标准base64的“+”和“/”字符分别替换为“-”和“u”,这样就不再需要使用URL编码器/解码器,也不会影响编码值的长度,从而使相同的编码形式保持不变,以便在关系数据库中使用。s、web表单和对象标识符。

    使用.NET,我想将当前代码从执行基本base64编码和解码改为使用“modified base64 for url”方法。有人这样做吗?

    要解码,我知道它始于以下几点:

    string base64EncodedText = base64UrlEncodedText.Replace('-', '+').Replace('_', '/');
    
    // Append '=' char(s) if necessary - how best to do this?
    
    // My normal base64 decoding now uses encodedText
    

    但是,我需要在末尾添加一两个“=”字符,这看起来有点复杂。

    我的编码逻辑应该简单一点:

    // 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('/', '_');
    

    我见过 Guid to Base64 for URL stackoverflow条目,但是它有一个已知的长度,因此它们可以在末尾硬编码所需的等号数量。

    5 回复  |  直到 10 年前
        1
  •  59
  •   AnthonyWJones    17 年前

    这应该正确地垫出:

     base64 = base64.PadRight(base64.Length + (4 - base64.Length % 4) % 4, '=');
    
        2
  •  171
  •   Fredrik Haglund    13 年前

    同时检查课程 httpserver实用程序 使用处理URL安全base64编码和解码的urltokenencode和urltokendecode方法。

    注意1:结果不是有效的base64字符串。URL的某些不安全字符被替换。

    注2:结果与RFC4648中的base64url算法不同。

    ///<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);
    }
    
        3
  •  23
  •   Stefan Zvonar    10 年前

    没有足够的注释点,但如果它有帮助的话,Sushil在提供的链接中找到的代码片段(JSON Web签名IETF草稿)在将base 64编码为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
        }
    
        4
  •  18
  •   Sushil    13 年前

    我在这里寻找代码进行base64url编码的编码/解码,这与问题中解释的base64略有不同。

    在此文档中找到C代码段。 JSON Web Signature ietf draft

        5
  •  5
  •   Chris Halcrow    10 年前

    与公认的答案相比,以下是您将如何从根本上 译码 一个base64编码的URL,使用c:

    Decode:

    string codedValue = "base64encodedUrlHere";
    
    string decoded;
    byte[] buffer =  Convert.FromBase64String(codedValue);
    decoded = Encoding.UTF8.GetString(buffer);
    
    推荐文章