Beispiel #1
0
        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;
                    }
                }
            }
        }