///
/// Returns string after decoding text, which was encoded in the Quoted Printable method.
///
/// Encoding used for the input data.
/// String containing data to decode.
///
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') // 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);
}
|