Создание Windows-приложений на основе Visual C#


           

выходного блока. const int MAX_BUF


using System; using System.Security.Cryptography; using System.Text;
namespace Mail { /// <summary> /// Конвертирование CryptoStream. /// <summary> public class FromQuotedPrintableTransform : ICryptoTransform, IDisposable { // максимальный размер входного\ выходного блока. const int MAX_BUF = 3;
// буфер byte [] _buf = null;
/// <summary> /// Значение, указывающее на возможность повторного использования текущей трансформации /// </summary> public bool CanReuseTransform { get { return true; } }
/// <summary> /// Значение, указывающее на возможность трансформации составных блоков. /// </summary> public bool CanTransformMultipleBlocks { get { return false; } }
/// <summary> /// Возвращение выходного размера блока. /// </summary> public int OutputBlockSize { get { return MAX_BUF; } }
/// <summary> /// Возвращение входного размера блока. /// </summary> public int InputBlockSize { get { return MAX_BUF; } }
/// <summary> /// Удаление всех элементов. /// </summary> public void Dispose() { _buf = null; GC.SuppressFinalize(this); }
/// <summary> /// Конвертирование указанного участка входящего массива байтов из quoted-printable (RFC 2045 (6.7)) /// и копирование результата в указанный участок выходного массива байтов. /// </summary> /// <param name="inputBuffer">Входящий массив байтов.</param> /// <param name="inputOffset">Начальная отметка участка, который нужно конвертировать.</param> /// <param name="inputCount">Количество байтов после индекса начала участка.</param> /// <param name="outputBuffer">Выходной массив байтов, в который требуется записать результат.</param> /// <param name="outputOffset">Начальная отметка участка, после которого необходимо вписать результат.</param> /// <returns>Количество вписанных байтов.</returns> public int TransformBlock(byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset) { // append unparsed characters if (_buf != null) { byte [] tmp = new byte[inputCount + _buf.Length]; Array.Copy(_buf, 0, tmp, 0, _buf.Length); Array.Copy(inputBuffer, inputOffset, tmp, _buf.Length, inputCount); inputBuffer = tmp;
inputCount = tmp.Length; _buf = null; } else { byte [] tmp = new byte[inputCount]; Array.Copy(inputBuffer, inputOffset, tmp, 0, inputCount); inputBuffer = tmp; }
int c = 0; int obi = outputOffset;
while (c < inputCount) { byte cb = inputBuffer[c++]; // skip CRLFs if (cb == '=') { // impossible to get next 2 bytes, save unparsed characters // for next session if (c + 1 >= inputCount) { int len = inputCount - c; _buf = new byte[len + 1]; // +1 is for '=' Array.Copy(inputBuffer, c - 1, _buf, 0, len + 1); break; }
// skip =\r\n if (!(inputBuffer[c] == '\r' && inputBuffer[c + 1] == '\n')) { // TODO Add check. Uppercase letters must be used (=DD); // lowercase letters are not allowed. try { byte b = Convert.ToByte(Encoding.ASCII.GetString(inputBuffer, c, 2), 16); outputBuffer[obi++] = b; } catch (FormatException e) { throw new ParseException("Incorrect sequence. Are you sure that it's quoted-printable?", e); } }
// take next sequence c += 2; } // incorrect characters for quoted-printable, just skip it else if (!(cb == '\r' || cb == '\n')) { outputBuffer[obi++] = cb; } }
return obi - outputOffset; }
/// <summary> /// Конвертирование указанного участка входящего массива байтов из quoted-printable (RFC 2045 (6.7)). /// </summary> /// <param name="inputBuffer">Входящий массив байтов.</param> /// <param name="inputOffset">Начальная отметка участка, который нужно конвертировать.</param> /// <param name="inputCount">Количество байтов после индекса начала участка.</param> /// <returns>Полученный массив байтов.</returns> public byte[] TransformFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount) { byte [] b = new byte[inputCount]; int s = TransformBlock(inputBuffer, inputOffset, inputCount, b, 0);
byte [] c = new byte[s]; Array.Copy(b, 0, c, 0, s); return c; } } }
Листинг 3.7.
Закрыть окно
Содержание  Назад  Вперед