private static byte[] UrlEncodeNonAscii(byte[] bytes, int offset, int count) { int cNonAscii = 0; // count them first for (int i = 0; i < count; i++) { if (IsNonAsciiByte(bytes[offset + i])) { cNonAscii++; } } // nothing to expand? if (0u >= (uint)cNonAscii) { return(bytes); } // expand not 'safe' characters into %XX, spaces to +s byte[] expandedBytes = new byte[count + cNonAscii * 2]; int pos = 0; for (int i = 0; i < count; i++) { byte b = bytes[offset + i]; if (IsNonAsciiByte(b)) { expandedBytes[pos++] = (byte)'%'; expandedBytes[pos++] = (byte)HttpEncoderUtility.IntToHex((b >> 4) & 0xf); expandedBytes[pos++] = (byte)HttpEncoderUtility.IntToHex(b & 0x0f); } else { expandedBytes[pos++] = b; } } return(expandedBytes); }
private static byte[] UrlEncodeToBytesImpl(byte[] bytes, int offset, int count) { 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 (0u >= (uint)cSpaces && 0u >= (uint)cUnsafe) { // DevDiv 912606: respect "offset" and "count" if (0 == offset && bytes.Length == count) { return(bytes); } else { byte[] 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); }