public BinaryEncoderStream(BinaryCodec codec, TextWriter outputWriter, int?bufferLength = null, bool closeWriter = true) { if (codec == null) { throw new ArgumentNullException(nameof(codec)); } if (outputWriter == null) { throw new ArgumentNullException(nameof(outputWriter)); } int outputBufferLength = bufferLength ?? DefaultOutputBufferSize; if ((outputBufferLength <= 0) || (outputBufferLength < codec.MinimumOutputBuffer)) { throw new ArgumentOutOfRangeException(nameof(bufferLength)); } _encoder = codec.GetEncoder(); _outputWriter = outputWriter; _inputBufferLength = codec.MinimumInputBuffer; _outputBuffer = new char[outputBufferLength]; _closeWriter = closeWriter; }
private static void Encode(BinaryCodec encoding, Stream inputStream, TextWriter outputWriter) { byte[] inputBuffer = new byte[encoding.MinimumInputBuffer]; char[] outputBuffer = new char[encoding.MinimumOutputBuffer]; bool readEof = false; int inputBufferEnd = 0; int inputBufferUsed; int outputBufferUsed; BinaryEncoder encoder = encoding.GetEncoder(); while (true) { if ((inputBufferEnd < inputBuffer.Length) && (!readEof)) { int bytesRead = inputStream.Read(inputBuffer, inputBufferEnd, inputBuffer.Length - inputBufferEnd); if (bytesRead == 0) { readEof = true; } inputBufferEnd += bytesRead; } // stop when we've read EOF and Convert returns true.. bool finished = ((encoder.Convert(inputBuffer, 0, inputBufferEnd, outputBuffer, 0, outputBuffer.Length, readEof, out inputBufferUsed, out outputBufferUsed)) && (readEof)); // dump any output produced to outputWriter.. outputWriter.Write(outputBuffer, 0, outputBufferUsed); if (finished) { break; } // shift input as needed.. if (inputBufferUsed != 0) { if (inputBufferUsed < inputBufferEnd) { Buffer.BlockCopy(inputBuffer, inputBufferUsed, inputBuffer, 0, inputBufferEnd - inputBufferUsed); inputBufferEnd -= inputBufferUsed; } else { inputBufferEnd = 0; } } } }