internal static byte[] UrlDecode(byte[] bytes, int offset, int count) { if (!ValidateUrlEncodingParameters(bytes, offset, count)) { return(null); } int decodedBytesCount = 0; byte[] decodedBytes = new byte[count]; for (int i = 0; i < count; i++) { int pos = offset + i; byte b = bytes[pos]; if (b == '+') { b = (byte)' '; } else if (b == '%' && i < count - 2) { int h1 = HttpEncoderUtility.HexToInt((char)bytes[pos + 1]); int h2 = HttpEncoderUtility.HexToInt((char)bytes[pos + 2]); if (h1 >= 0 && h2 >= 0) // valid 2 hex chars { b = (byte)((h1 << 4) | h2); i += 2; } } decodedBytes[decodedBytesCount++] = b; } if (decodedBytesCount < decodedBytes.Length) { byte[] newDecodedBytes = new byte[decodedBytesCount]; Array.Copy(decodedBytes, newDecodedBytes, decodedBytesCount); decodedBytes = newDecodedBytes; } return(decodedBytes); }
protected internal override void Render(HtmlTextWriter output) { Page p = Page; if (p == null) { throw new HttpException(SR.GetString(SR.Form_Needs_Page)); } #pragma warning disable 0618 // To avoid deprecation warning if (p.SmartNavigation) { #pragma warning restore 0618 ((IAttributeAccessor)this).SetAttribute("__smartNavEnabled", "true"); // Output the IFrame StringBuilder sb = new StringBuilder("<IFRAME id=\"__hifSmartNav\" name=\"__hifSmartNav\" style=\"display:none\" src=\""); sb.Append(HttpEncoderUtility.UrlEncodeSpaces(HttpUtility.HtmlAttributeEncode(Page.ClientScript.GetWebResourceUrl(typeof(HtmlForm), "SmartNav.htm")))); sb.Append("\"></IFRAME>"); output.WriteLine(sb.ToString()); } base.Render(output); }
/// <summary> /// Converts a hexadecimal string into its binary representation. /// </summary> /// <param name="data">The hex string.</param> /// <returns>The byte array corresponding to the contents of the hex string, /// or null if the input string is not a valid hex string.</returns> public static byte[] HexToBinary(string data) { if (data == null || data.Length % 2 != 0) { // input string length is not evenly divisible by 2 return(null); } byte[] binary = new byte[data.Length / 2]; for (int i = 0; i < binary.Length; i++) { int highNibble = HttpEncoderUtility.HexToInt(data[2 * i]); int lowNibble = HttpEncoderUtility.HexToInt(data[2 * i + 1]); if (highNibble == -1 || lowNibble == -1) { return(null); // bad hex data } binary[i] = (byte)((highNibble << 4) | lowNibble); } return(binary); }
internal static string UrlDecode(byte[] bytes, int offset, int count, Encoding encoding) { if (!ValidateUrlEncodingParameters(bytes, offset, count)) { return(null); } UrlDecoder helper = new UrlDecoder(count, encoding); // go through the bytes collapsing %XX and %uXXXX and appending // each byte as byte, with exception of %uXXXX constructs that // are appended as chars for (int i = 0; i < count; i++) { int pos = offset + i; byte b = bytes[pos]; // The code assumes that + and % cannot be in multibyte sequence if (b == '+') { b = (byte)' '; } else if (b == '%' && i < count - 2) { if (bytes[pos + 1] == 'u' && i < count - 5) { int h1 = HttpEncoderUtility.HexToInt((char)bytes[pos + 2]); int h2 = HttpEncoderUtility.HexToInt((char)bytes[pos + 3]); int h3 = HttpEncoderUtility.HexToInt((char)bytes[pos + 4]); int h4 = HttpEncoderUtility.HexToInt((char)bytes[pos + 5]); if (h1 >= 0 && h2 >= 0 && h3 >= 0 && h4 >= 0) // valid 4 hex chars { char ch = (char)((h1 << 12) | (h2 << 8) | (h3 << 4) | h4); i += 5; // don't add as byte helper.AddChar(ch); continue; } } else { int h1 = HttpEncoderUtility.HexToInt((char)bytes[pos + 1]); int h2 = HttpEncoderUtility.HexToInt((char)bytes[pos + 2]); if (h1 >= 0 && h2 >= 0) // valid 2 hex chars { b = (byte)((h1 << 4) | h2); i += 2; } } } helper.AddByte(b); } return(helper.GetString()); }
internal static byte[] UrlEncode(byte[] bytes, int offset, int count) { if (!ValidateUrlEncodingParameters(bytes, offset, count)) { return(null); } int cSpaces = 0; int cUnsafe = 0; // count them first for (int i = 0; i < count; i++) { char ch = (char)bytes[offset + i]; if (ch == ' ') { cSpaces++; } else if (!HttpEncoderUtility.IsUrlSafeChar(ch)) { cUnsafe++; } } // nothing to expand? if (cSpaces == 0 && cUnsafe == 0) { // DevDiv 912606: respect "offset" and "count" if (0 == offset && bytes.Length == count) { return(bytes); } else { var subarray = new byte[count]; Buffer.BlockCopy(bytes, offset, subarray, 0, count); return(subarray); } } // expand not 'safe' characters into %XX, spaces to +s byte[] expandedBytes = new byte[count + cUnsafe * 2]; int pos = 0; for (int i = 0; i < count; i++) { byte b = bytes[offset + i]; char ch = (char)b; if (HttpEncoderUtility.IsUrlSafeChar(ch)) { expandedBytes[pos++] = b; } else if (ch == ' ') { expandedBytes[pos++] = (byte)'+'; } else { expandedBytes[pos++] = (byte)'%'; expandedBytes[pos++] = (byte)HttpEncoderUtility.IntToHex((b >> 4) & 0xf); expandedBytes[pos++] = (byte)HttpEncoderUtility.IntToHex(b & 0x0f); } } return(expandedBytes); }
internal static string UrlDecode(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 %uXXXX 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) { if (value[pos + 1] == 'u' && pos < count - 5) { int h1 = HttpEncoderUtility.HexToInt(value[pos + 2]); int h2 = HttpEncoderUtility.HexToInt(value[pos + 3]); int h3 = HttpEncoderUtility.HexToInt(value[pos + 4]); int h4 = HttpEncoderUtility.HexToInt(value[pos + 5]); if (h1 >= 0 && h2 >= 0 && h3 >= 0 && h4 >= 0) // valid 4 hex chars { ch = (char)((h1 << 12) | (h2 << 8) | (h3 << 4) | h4); pos += 5; // only add as char helper.AddChar(ch); continue; } } else { int h1 = HttpEncoderUtility.HexToInt(value[pos + 1]); int h2 = HttpEncoderUtility.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()); }