Esempio n. 1
0
        ReadInternalAsync(Memory <byte> buffer, CancellationToken cancellationToken)
        {
            var input  = new ZSTD_Buffer(pos, size);
            var output = new ZSTD_Buffer(UIntPtr.Zero, (UIntPtr)buffer.Length);

            while (!output.IsFullyConsumed)
            {
                if (input.IsFullyConsumed)
                {
                    int bytesRead;
#if !(NET45 || NETSTANDARD2_0)
                    if ((bytesRead = await innerStream.ReadAsync(inputMemory, cancellationToken).ConfigureAwait(false)) == 0)
#else
                    if ((bytesRead = await innerStream.ReadAsync(inputBuffer, 0, bufferSize, cancellationToken).ConfigureAwait(false)) == 0)
#endif
                    { break; }

                    input.size = (UIntPtr)bytesRead;
                    input.pos  = UIntPtr.Zero;
                }

                Decompress(buffer.Span, ref output, ref input);
            }

            pos  = input.pos;
            size = input.size;

            return((int)output.pos);
        }
Esempio n. 2
0
        private void WriteInternal(ReadOnlySpan <byte> buffer)
        {
            if (buffer.Length == 0)
            {
                return;
            }

            var input  = new ZSTD_Buffer(UIntPtr.Zero, (UIntPtr)buffer.Length);
            var output = new ZSTD_Buffer(pos, (UIntPtr)bufferSize);

            var outputSpan = new ReadOnlySpan <byte>(outputBuffer, 0, bufferSize);

            do
            {
                if (output.IsFullyConsumed)
                {
                    FlushOutputBuffer(outputSpan.Slice(0, (int)output.pos));
                    output.pos = UIntPtr.Zero;
                }

                Compress(buffer, ref output, ref input, ZSTD_EndDirective.ZSTD_e_continue);
            } while(!input.IsFullyConsumed);

            pos = output.pos;
        }
Esempio n. 3
0
        private unsafe void Decompress(Span <byte> buffer, ref ZSTD_Buffer output, ref ZSTD_Buffer input)
        {
            fixed(void *inputBufferHandle = &inputBuffer[0])
            fixed(void *outputBufferHandle = &MemoryMarshal.GetReference(buffer))
            {
                input.buffer  = new IntPtr(inputBufferHandle);
                output.buffer = new IntPtr(outputBufferHandle);

                ZSTD_decompressStream(dStream, ref output, ref input).EnsureZstdSuccess();
            }
        }
Esempio n. 4
0
        private unsafe UIntPtr Compress(ReadOnlySpan <byte> buffer, ref ZSTD_Buffer output, ref ZSTD_Buffer input, ZSTD_EndDirective directive)
        {
            fixed(void *inputHandle = &MemoryMarshal.GetReference(buffer))
            fixed(void *outputHandle = &outputBuffer[0])
            {
                input.buffer  = new IntPtr(inputHandle);
                output.buffer = new IntPtr(outputHandle);

                return(ZSTD_compressStream2(cStream, ref output, ref input, directive).EnsureZstdSuccess());
            }
        }
Esempio n. 5
0
        private int FillInputBuffer(Span <byte> inputSpan, ref ZSTD_Buffer input)
        {
#if !(NET45 || NETSTANDARD2_0)
            int bytesRead = innerStream.Read(inputSpan);
#else
            int bytesRead = innerStream.Read(inputBuffer, 0, inputSpan.Length);
#endif

            input.size = (UIntPtr)bytesRead;
            input.pos  = UIntPtr.Zero;

            return(bytesRead);
        }
Esempio n. 6
0
        private int ReadInternal(Span <byte> buffer)
        {
            var input  = new ZSTD_Buffer(pos, size);
            var output = new ZSTD_Buffer(UIntPtr.Zero, (UIntPtr)buffer.Length);

            var inputSpan = new Span <byte>(inputBuffer, 0, bufferSize);

            while (!output.IsFullyConsumed && (!input.IsFullyConsumed || FillInputBuffer(inputSpan, ref input) > 0))
            {
                Decompress(buffer, ref output, ref input);
            }

            pos  = input.pos;
            size = input.size;

            return((int)output.pos);
        }
Esempio n. 7
0
        public override void Write(byte[] buffer, int offset, int count)
        {
            using (var inBuffer = new ArraySegmentPtr(buffer, offset, count))
            {
                var inputBufferState = new ZSTD_Buffer(inBuffer);

                while (!inputBufferState.IsFullyConsumed)
                {
                    if (OutputBufferState.IsFullyConsumed)
                    {
                        FlushOutputBuffer();
                    }

                    ZSTD_compressStream(CStream, ref OutputBufferState, ref inputBufferState).EnsureZstdSuccess();
                }
            }
        }
Esempio n. 8
0
        public override int Read(byte[] buffer, int offset, int count)
        {
            using (var outputBufferPtr = new ArraySegmentPtr(buffer, offset, count))
            {
                var outputBufferState = new ZSTD_Buffer(outputBufferPtr);
                while (!outputBufferState.IsFullyConsumed)
                {
                    if (InputBufferState.IsFullyConsumed && !TryRefreshInputBuffer())
                    {
                        break;
                    }

                    ZSTD_decompressStream(DStream, ref outputBufferState, ref InputBufferState).EnsureZstdSuccess();
                }

                return(outputBufferState.IntPos - offset);//return change in output position as number of read bytes
            }
        }
Esempio n. 9
0
        WriteInternalAsync(ReadOnlyMemory <byte> buffer, CancellationToken cancellationToken)
        {
            if (buffer.Length == 0)
            {
                return;
            }

            var input  = new ZSTD_Buffer(UIntPtr.Zero, (UIntPtr)buffer.Length);
            var output = new ZSTD_Buffer(pos, (UIntPtr)bufferSize);

            do
            {
                if (output.IsFullyConsumed)
                {
                    await FlushOutputBufferAsync(ref output, cancellationToken).ConfigureAwait(false);

                    output.pos = UIntPtr.Zero;
                }

                Compress(buffer.Span, ref output, ref input, ZSTD_EndDirective.ZSTD_e_continue);
            } while(!input.IsFullyConsumed);

            pos = output.pos;
        }
Esempio n. 10
0
 public static extern size_t ZSTD_decompressStream(IntPtr zds, ref ZSTD_Buffer output, ref ZSTD_Buffer input);
Esempio n. 11
0
 public static extern size_t ZSTD_endStream(IntPtr zcs, ref ZSTD_Buffer output);
Esempio n. 12
0
 private void InitializeInputBufferState()
 {
     InputBufferState     = new ZSTD_Buffer(InputBuffer);
     InputBufferState.pos = InputBufferState.size;
 }
Esempio n. 13
0
 private void InitializedOutputBufferState()
 {
     OutputBufferState = new ZSTD_Buffer(OutputBuffer);
 }
Esempio n. 14
0
 public static extern size_t ZSTD_compressStream2(IntPtr zcs, ref ZSTD_Buffer output, ref ZSTD_Buffer input, ZSTD_EndDirective endOp);
Esempio n. 15
0
 private Task FlushOutputBufferAsync(ref ZSTD_Buffer output, CancellationToken cancellationToken)
 => innerStream.WriteAsync(outputBuffer, 0, (int)output.pos, cancellationToken);
Esempio n. 16
0
 private ValueTask FlushOutputBufferAsync(ref ZSTD_Buffer output, CancellationToken cancellationToken)
 => innerStream.WriteAsync(outputMemory.Slice(0, (int)output.pos), cancellationToken);