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); }
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; }
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(); } }
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()); } }
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); }
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); }
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(); } } }
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 } }
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; }
public static extern size_t ZSTD_decompressStream(IntPtr zds, ref ZSTD_Buffer output, ref ZSTD_Buffer input);
public static extern size_t ZSTD_endStream(IntPtr zcs, ref ZSTD_Buffer output);
private void InitializeInputBufferState() { InputBufferState = new ZSTD_Buffer(InputBuffer); InputBufferState.pos = InputBufferState.size; }
private void InitializedOutputBufferState() { OutputBufferState = new ZSTD_Buffer(OutputBuffer); }
public static extern size_t ZSTD_compressStream2(IntPtr zcs, ref ZSTD_Buffer output, ref ZSTD_Buffer input, ZSTD_EndDirective endOp);
private Task FlushOutputBufferAsync(ref ZSTD_Buffer output, CancellationToken cancellationToken) => innerStream.WriteAsync(outputBuffer, 0, (int)output.pos, cancellationToken);
private ValueTask FlushOutputBufferAsync(ref ZSTD_Buffer output, CancellationToken cancellationToken) => innerStream.WriteAsync(outputMemory.Slice(0, (int)output.pos), cancellationToken);