private void Fill()
        {
            int num = _targetStream.Read(_header, 0, HeaderSize);

            if (num == 0)
            {
                _unpackedBuffer = null;
            }
            else
            {
                if (num != 8)
                {
                    throw new InvalidDataException("input buffer corrupted (header)");
                }
                int compressedSize = Lz4.GetCompressedSize(_header);
                if ((_readBuffer == null) || (_readBuffer.Length < (compressedSize + HeaderSize)))
                {
                    _readBuffer = new byte[compressedSize + HeaderSize];
                }
                Buffer.BlockCopy(_header, 0, _readBuffer, 0, HeaderSize);
                if (_targetStream.Read(_readBuffer, HeaderSize, compressedSize) != compressedSize)
                {
                    throw new InvalidDataException("input buffer corrupted (body)");
                }
                _unpackedLength = Lz4.Decompress(_readBuffer, 0, ref _unpackedBuffer);
                _unpackedOffset = 0;
            }
        }
        public override void Flush()
        {
            if (_writeBufferOffset <= 0)
            {
                return;
            }
            var count = Lz4.Compress(_writeBuffer, 0, _writeBufferOffset, ref _compressedBuffer, _compressionMode);

            _targetStream.Write(_compressedBuffer, 0, count);
            _writeBufferOffset = 0;
        }
 public Lz4CompressionStream(Stream targetStream, int bufferSize, Lz4Mode mode = 0, bool closeStream = false)
     : this(targetStream, new byte[bufferSize], new byte[Lz4.LZ4_compressBound(bufferSize)], mode, closeStream)
 {
 }