zoukankan      html  css  js  c++  java
  • 对编码内容多次UrlDecode

    对编码内容多次UrlDecode,并不会影响最终结果。

    尝试阅读了微软的源代码,不过不容易读懂。

    网址:https://referencesource.microsoft.com/#System/net/System/Net/WebUtility.cs,73c04b8a4fde5039

    以下为从网址上复制下来的一些关键代码,不过没看懂。

    public static string UrlDecode(string encodedValue)
            {
                if (encodedValue == null)
                    return null;
     
                return UrlDecodeInternal(encodedValue, Encoding.UTF8);
            }
    private static string UrlDecodeInternal(string value, Encoding encoding)
            {
                if (value == null)
                {
                    return null;
                }
     
                int count = value.Length;
                UrlDecoder helper = new UrlDecoder(count, encoding);
     
                // go through the string's chars collapsing %XX and
                // appending each char as char, with exception of %XX constructs
                // that are appended as bytes
     
                for (int pos = 0; pos < count; pos++)
                {
                    char ch = value[pos];
     
                    if (ch == '+')
                    {
                        ch = ' ';
                    }
                    else if (ch == '%' && pos < count - 2)
                    {
                        int h1 = HexToInt(value[pos + 1]);
                        int h2 = HexToInt(value[pos + 2]);
     
                        if (h1 >= 0 && h2 >= 0)
                        {     // valid 2 hex chars
                            byte b = (byte)((h1 << 4) | h2);
                            pos += 2;
     
                            // don't add as char
                            helper.AddByte(b);
                            continue;
                        }
                    }
     
                    if ((ch & 0xFF80) == 0)
                        helper.AddByte((byte)ch); // 7 bit have to go as bytes because of Unicode
                    else
                        helper.AddChar(ch);
                }
     
                return helper.GetString();
            }
     internal void AddChar(char ch)
                {
                    if (_numBytes > 0)
                        FlushBytes();
     
                    _charBuffer[_numChars++] = ch;
                }
      internal void AddByte(byte b)
                {
                    if (_byteBuffer == null)
                        _byteBuffer = new byte[_bufferSize];
     
                    _byteBuffer[_numBytes++] = b;
                }
     internal String GetString()
                {
                    if (_numBytes > 0)
                        FlushBytes();
     
                    if (_numChars > 0)
                        return new String(_charBuffer, 0, _numChars);
                    else
                        return String.Empty;
                }
    String(_charBuffer, 0, _numChars);是看不到源代码的,到这里已经变成一行看不懂的代码
            // Creates a new string from the characters in a subarray.  The new string will
            // be created from the characters in value between startIndex and
            // startIndex + length - 1.
            //
            [System.Security.SecuritySafeCritical]  // auto-generated
            [ResourceExposure(ResourceScope.None)]
            [MethodImplAttribute(MethodImplOptions.InternalCall)]
            public extern String(char [] value, int startIndex, int length);

    下一步应该怎么办,只能希望某个大牛指点下了……

     
  • 相关阅读:
    概率图模型(CPD)(二)
    概率图模型(贝叶斯网络)(一)
    EM算法理论与推导
    关于无向图的最大团的问题。
    机器学习实战基础(四十二):逻辑回归之 1 概述
    条件独立性
    pl/sql的tnsnames.ora文件配置
    eclipse修改SVN账号密码
    Centos安装
    Linux虚拟机安装
  • 原文地址:https://www.cnblogs.com/Tpf386/p/9804735.html
Copyright © 2011-2022 走看看