<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>Decoding text encoded in Quoted-Printable format</Title>
      <Shortcut>DecodingtextencodedinQuoted-Printableformat</Shortcut>
      <Description>Decoding text encoded in Quoted-Printable format [C#]</Description>
      <Author>Prasad GVL</Author>
      <HelpUrl>/PreviewSnippet.aspx?SnippetID=3fdb5cc4-ee88-4944-9d96-2ad64775e97c</HelpUrl>
      <SnippetTypes>
        <SnippetType>SurroundsWith</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Code Language="csharp"><![CDATA[        /// <summary>
        /// Returns string after decoding text, which was encoded in the Quoted Printable method.
        /// </summary>
        /// <param name="encoding">Encoding used for the input data.</param>
        /// <param name="data">String containing data to decode.</param>
        /// <returns></returns>
        public static string QDecode(System.Text.Encoding encoding,string data)
		{
			MemoryStream dStrm = new MemoryStream();
			byte[] buffer, UnicodeChars;
			string str, encodedChar;
			int val;
			try
			{
				MemoryStream strm = new MemoryStream(System.Text.Encoding.ASCII.GetBytes(data));
				int Byte = strm.ReadByte();
				while(Byte > -1)
				{
					// Hex eg. =E4
					if(Byte == '=')
					{
						buffer = new byte[2];
						strm.Read(buffer,0,2);
						str=System.Text.Encoding.ASCII.GetString(buffer);
						// When the data contains URLs, there is chance that normal characters appear after '=' symbol
						// To handle this, we have to check whether the chars following '=' can be converted to Hexa or not
						// If the chars cant be converted, then they should be converted as is
						// i.e. program control goes to 'else' part
						if(!(buffer[0] == '\r' && buffer[1] == '\n') // <CRLF> followed by =, it's splitted line
							&& (IsHexChar(str.Substring(0,1)) && IsHexChar(str.Substring(1,1)))) // Make sure it is a Hex number
						{
							val = int.Parse(str,System.Globalization.NumberStyles.HexNumber);
							encodedChar = encoding.GetString(new byte[]{(byte)val});
							UnicodeChars = System.Text.Encoding.Unicode.GetBytes(encodedChar);
							dStrm.Write(UnicodeChars,0,UnicodeChars.Length);
						}
						else
						{
							// There is some text after '=', so convert them as is.
							// First convert the '=' symbol
							encodedChar = encoding.GetString(new byte[]{(byte)Byte});
							UnicodeChars = System.Text.Encoding.Unicode.GetBytes(encodedChar);
							dStrm.Write(UnicodeChars,0,UnicodeChars.Length);
							// Then convert the read 2 bytes, which are in buffer
							encodedChar = encoding.GetString(buffer);
							UnicodeChars = System.Text.Encoding.Unicode.GetBytes(encodedChar);
							dStrm.Write(UnicodeChars,0,UnicodeChars.Length);
						}					
					}
					else
					{
						encodedChar = encoding.GetString(new byte[]{(byte)Byte});
						UnicodeChars = System.Text.Encoding.Unicode.GetBytes(encodedChar);
						dStrm.Write(UnicodeChars,0,UnicodeChars.Length);
					}
					Byte = strm.ReadByte();
				}
			}
			catch(Exception ex)
			{
				throw ex;
			}
			byte[] retchars=dStrm.ToArray();
			//Close the memory stream object
			dStrm.Close();
			return System.Text.Encoding.Unicode.GetString(retchars);
		}]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>