示例#1
0
        public DecompressionStream(Stream stream, int bufferSize = 0)
        {
            if (stream == null)
            {
                throw new ArgumentNullException(nameof(stream));
            }

            if (!stream.CanRead)
            {
                throw new ArgumentException("Stream is not readable", nameof(stream));
            }

            if (bufferSize < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(bufferSize));
            }

            innerStream  = stream;
            decompressor = new Decompressor();

            inputBufferSize = bufferSize > 0 ? bufferSize : (int)Methods.ZSTD_CStreamInSize().EnsureZstdSuccess();
            inputBuffer     = ArrayPool <byte> .Shared.Rent(inputBufferSize);

            input = new ZSTD_inBuffer_s {
                pos = (nuint)inputBufferSize, size = (nuint)inputBufferSize
            };
        }
示例#2
0
 internal nuint DecompressStream(ref ZSTD_inBuffer_s input, ref ZSTD_outBuffer_s output)
 {
     fixed(ZSTD_inBuffer_s *inputPtr = &input)
     fixed(ZSTD_outBuffer_s * outputPtr = &output)
     {
         return(Methods.ZSTD_decompressStream(dctx, outputPtr, inputPtr).EnsureZstdSuccess());
     }
 }
示例#3
0
 internal unsafe nuint CompressStream(ref ZSTD_inBuffer_s input, ReadOnlySpan <byte> inputBuffer,
                                      ZSTD_EndDirective directive)
 {
     fixed(byte *inputBufferPtr = inputBuffer)
     fixed(byte *outputBufferPtr = outputBuffer)
     {
         input.src  = inputBufferPtr;
         output.dst = outputBufferPtr;
         return(compressor.CompressStream(ref input, ref output, directive).EnsureZstdSuccess());
     }
 }
示例#4
0
        private void WriteInternal(ReadOnlySpan <byte> buffer, bool lastChunk)
        {
            EnsureNotDisposed();

            var input = new ZSTD_inBuffer_s {
                pos = 0, size = buffer != null ? (nuint)buffer.Length : 0
            };
            nuint remaining;

            do
            {
                output.pos = 0;
                remaining  = CompressStream(ref input, buffer,
                                            lastChunk ? ZSTD_EndDirective.ZSTD_e_end : ZSTD_EndDirective.ZSTD_e_continue);

                var written = (int)output.pos;
                if (written > 0)
                {
                    innerStream.Write(outputBuffer, 0, written);
                }
            } while (lastChunk ? remaining > 0 : input.pos < input.size);
        }
示例#5
0
        private async ValueTask WriteInternalAsync(ReadOnlyMemory <byte>?buffer, bool lastChunk,
                                                   CancellationToken cancellationToken = default)
        {
            EnsureNotDisposed();

            var input = new ZSTD_inBuffer_s {
                pos = 0, size = buffer.HasValue ? (nuint)buffer.Value.Length : 0
            };
            nuint remaining;

            do
            {
                output.pos = 0;
                remaining  = CompressStream(ref input, buffer.HasValue ? buffer.Value.Span : null,
                                            lastChunk ? ZSTD_EndDirective.ZSTD_e_end : ZSTD_EndDirective.ZSTD_e_continue);

                var written = (int)output.pos;
                if (written > 0)
                {
                    await innerStream.WriteAsync(outputBuffer, 0, written, cancellationToken).ConfigureAwait(false);
                }
            } while (lastChunk ? remaining > 0 : input.pos < input.size);
        }