ZstdNet 1.5.7
dotnet add package ZstdNet --version 1.5.7
NuGet\Install-Package ZstdNet -Version 1.5.7
<PackageReference Include="ZstdNet" Version="1.5.7" />
<PackageVersion Include="ZstdNet" Version="1.5.7" />
<PackageReference Include="ZstdNet" />
paket add ZstdNet --version 1.5.7
#r "nuget: ZstdNet, 1.5.7"
#:package ZstdNet@1.5.7
#addin nuget:?package=ZstdNet&version=1.5.7
#tool nuget:?package=ZstdNet&version=1.5.7
ZstdNet 
ZstdNet is a wrapper of Zstd native library for .NET languages targeting netstadard2.{0|1}.
ZstdNet NuGet package includes pre-built native shared libraries for various platforms, including win, linux, osx.
The package relies on the dotnet runtime identifier resolution mechanism.
For .NET Framework, the package provides a targets fallback, which requires an explicit selection of the platform — x86, x64 or ARM64).
If you need to resolve native dependency at runtime, you can use the NativeLibrary.SetDllImportResolver (see an example).
And for .NET Framework — SetDllDirectory from kernel32.dll.
Provenance attestation is enabled for all artifacts in this repository including native libs, see page Attestations.
Features
- Compression and decompression of byte arrays and
Span<byte> - Streaming compression and decompression
- Advanced parameters support
- Generation of dictionaries
Take a look on a library reference or unit tests to explore its behavior in different situations.
Zstd
Zstandard, or zstd as short version, is a fast lossless compression algorithm, targeting real-time compression scenarios at zlib-level and better compression ratios.
Zstd is initially developed by Yann Collet and the source is available at: https://github.com/facebook/zstd
The motivation to develop of the algorithm, ways of use and its properties are explained in the blog that introduces the library: http://fastcompression.blogspot.com/2015/01/zstd-stronger-compression-algorithm.html
The benefits of the dictionary mode are described here: http://fastcompression.blogspot.ru/2016/02/compressing-small-data.html
Reference
Exceptions
The wrapper throws ZstdException in case of malformed data or an error inside libzstd.
If the given destination buffer is too small, ZstdException with ZSTD_error_dstSize_tooSmall
error code is thrown away.
Check zstd_errors.h for more info.
Compressor class
Block compression implementation. Instances of this class are not thread-safe.
Consider using ThreadStatic or pool of compressors for bulk processing.
Constructor allow specifying compression options. Otherwise, default values will be used for
CompressionOptions.Compressor(); Compressor(CompressionOptions options);Options will be exposed in
Optionsread-only field.Note that
Compressorclass implementsIDisposable. If you use a lot of instances of this class, it's recommended to callDisposeto avoid loading on the finalizer thread. For example:using var compressor = new Compressor(); var compressedData = compressor.Wrap(sourceData);Wrapcompress data and save it in a new or an existing buffer (in such case a length of saved data will be returned).byte[] Wrap(byte[] src); byte[] Wrap(ArraySegment<byte> src); byte[] Wrap(ReadOnlySpan<byte> src); int Wrap(byte[] src, byte[] dst, int offset); int Wrap(ArraySegment<byte> src, byte[] dst, int offset); int Wrap(ReadOnlySpan<byte> src, byte[] dst, int offset); int Wrap(ReadOnlySpan<byte> src, Span<byte> dst);Note that on buffers close to 2GB
Wraptries its best, but ifsrcis uncompressible and its size is too large,ZSTD_error_dstSize_tooSmallwill be thrown.Wrapmethod call will only be reliable for a buffer size such thatGetCompressBoundLong(size) <= 0x7FFFFFC7. Consider using streaming compression API on large data inputs.GetCompressBoundreturns required destination buffer size for source data of sizesize.static int GetCompressBound(int size); static ulong GetCompressBoundLong(ulong size);
CompressionStream class
Implementation of streaming compression. The stream is write-only.
Constructor
CompressionStream(Stream stream); CompressionStream(Stream stream, int bufferSize); CompressionStream(Stream stream, CompressionOptions options, int bufferSize = 0);Options:
Stream stream— output stream for writing compressed data.CompressionOptions optionsDefault isCompressionOptions.Defaultwith default compression level.int bufferSize— buffer size used for compression buffer. Default is the result of callingZSTD_CStreamOutSizewhich guarantees to successfully flush at least one complete compressed block (currently ~128KB).
The buffer for compression is allocated using
ArrayPool<byte>.Shared.Rent().Note that
CompressionStreamclass implementsIDisposableandIAsyncDisposable. If you use a lot of instances of this class, it's recommended to callDisposeorDisposeAsyncto avoid loading on the finalizer thread. For example:await using var compressionStream = new CompressionStream(outputStream, zstdBufferSize); await inputStream.CopyToAsync(compressionStream, copyBufferSize);
CompressionOptions class
Stores compression options and "digested" (for compression) information from a compression dictionary, if present. Instances of this class are thread-safe. They can be shared across threads to avoid performance and memory overhead.
Constructor
CompressionOptions(int compressionLevel); CompressionOptions(byte[] dict, int compressionLevel = DefaultCompressionLevel); CompressionOptions(byte[] dict, IReadOnlyDictionary<ZSTD_cParameter, int> advancedParams, int compressionLevel = DefaultCompressionLevel);Options:
byte[] dict— compression dictionary. It can be read from a file or generated withDictBuilderclass. Default isnull(no dictionary).int compressionLevel— compression level. Should be in range fromCompressionOptions.MinCompressionLeveltoCompressionOptions.MaxCompressionLevel(currently 22). Default isCompressionOptions.DefaultCompressionLevel(currently 3).IReadOnlyDictionary<ZSTD_cParameter, int> advancedParams— advanced API provides a way to set specific parameters during compression. For example, it allows you to compress with multiple threads, enable long distance matching mode and more. Check zstd.h for additional info.
Specified options will be exposed in read-only fields.
Note that
CompressionOptionsclass implementsIDisposable. If you use a lot of instances of this class, it's recommended to callDisposeto avoid loading on the finalizer thread. For example:using var options = new CompressionOptions(dict, compressionLevel: 5); using var compressor = new Compressor(options); var compressedData = compressor.Wrap(sourceData);
Decompressor class
Block decompression implementation. Instances of this class are not thread-safe.
Consider using ThreadStatic or pool of decompressors for bulk processing.
Constructor allow specifying decompression options. Otherwise, default values for
DecompressionOptionswill be used.new Decompressor(); new Decompressor(DecompressionOptions options);Options will be exposed in
Optionsread-only field.Note that
Decompressorclass implementsIDisposable. If you use a lot of instances of this class, it's recommended to callDisposeto avoid loading on the finalizer thread. For example:using var decompressor = new Decompressor(); var decompressedData = decompressor.Unwrap(compressedData);Unwrapdecompress data and save it in a new or an existing buffer (in such case a length of saved data will be returned).byte[] Unwrap(byte[] src, int maxDecompressedSize = int.MaxValue); byte[] Unwrap(ArraySegment<byte> src, int maxDecompressedSize = int.MaxValue); byte[] Unwrap(ReadOnlySpan<byte> src, int maxDecompressedSize = int.MaxValue); int Unwrap(byte[] src, byte[] dst, int offset, bool bufferSizePrecheck = true); int Unwrap(ArraySegment<byte> src, byte[] dst, int offset, bool bufferSizePrecheck = true); int Unwrap(ReadOnlySpan<byte> src, byte[] dst, int offset, bool bufferSizePrecheck = true); int Unwrap(ReadOnlySpan<byte> src, Span<byte> dst, bool bufferSizePrecheck = true);Data can be saved to a new buffer only if a field with decompressed data size is present in compressed data. You can limit size of the new buffer with
maxDecompressedSizeparameter (it's necessary to do this on untrusted data).If
bufferSizePrecheckflag is set and the decompressed field length is specified, the size of the destination buffer will be checked before actual decompression.Note that if this field is malformed (and is less than actual decompressed data size), libzstd still doesn't allow a buffer overflow to happen during decompression.
GetDecompressedSizereads a field with decompressed data size stored in compressed data.static ulong GetDecompressedSize(byte[] src); static ulong GetDecompressedSize(ArraySegment<byte> src); static ulong GetDecompressedSize(ReadOnlySpan<byte> src);
DecompressionStream class
Implementation of streaming decompression. The stream is read-only.
Constructor
DecompressionStream(Stream stream); DecompressionStream(Stream stream, int bufferSize); DecompressionStream(Stream stream, DecompressionOptions options, int bufferSize = 0);Options:
Stream stream— input stream for reading raw data.DecompressionOptions optionsDefault isnull(no dictionary).int bufferSize— buffer size used for decompression buffer. Default is the result of callingZSTD_DStreamInSize— recommended size for input buffer (currently ~128KB).
The buffer for decompression is allocated using
ArrayPool<byte>.Shared.Rent().Note that
DecompressionStreamclass implementsIDisposableandIAsyncDisposable. If you use a lot of instances of this class, it's recommended to callDisposeorDisposeAsyncto avoid loading on the finalizer thread. For example:await using var decompressionStream = new DecompressionStream(inputStream, zstdBufferSize); await decompressionStream.CopyToAsync(outputStream, copyBufferSize);
DecompressionOptions class
Stores decompression options and "digested" (for decompression) information from a compression dictionary, if present. Instances of this class are thread-safe. They can be shared across threads to avoid performance and memory overhead.
Constructor
DecompressionOptions(); DecompressionOptions(byte[] dict); DecompressionOptions(byte[] dict, IReadOnlyDictionary<ZSTD_dParameter, int> advancedParams);Options:
byte[] dict— compression dictionary. It can be read from a file or generated withDictBuilderclass. Default isnull(no dictionary).IReadOnlyDictionary<ZSTD_dParameter, int> advancedParams— advanced decompression API that allows you to set parameters like maximum memory usage. Check zstd.h for additional info.
Specified options will be exposed in read-only fields.
Note that
CompressionOptionsclass implementsIDisposable. If you use a lot of instances of this class, it's recommended to callDisposeto avoid loading on the finalizer thread. For example:using var options = new DecompressionOptions(dict); using var decompressor = new Decompressor(options); var decompressedData = decompressor.Unwrap(compressedData);
DictBuilder static class
TrainFromBuffergenerates a compression dictionary from a collection of samples.static byte[] TrainFromBuffer(IEnumerable<byte[]> samples, int dictCapacity = DefaultDictCapacity);Options:
int dictCapacity— maximal dictionary size in bytes. Default isDictBuilder.DefaultDictCapacity, currently 110 KiB (the default in zstd utility).
Wrapper Authors
Copyright (c) 2016-2026 SKB Kontur
ZstdNet is distributed under BSD 3-Clause License.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- System.Memory (>= 4.6.3)
-
.NETStandard 2.1
- No dependencies.
NuGet packages (22)
Showing the top 5 NuGet packages that depend on ZstdNet:
| Package | Downloads |
|---|---|
|
Pulsar.Client
.NET client library for Apache Pulsar |
|
|
ZoneTree
ZoneTree is a persistent, high-performance, transactional, ACID-compliant ordered key-value database for NET. It can operate in memory or on local/cloud storage. |
|
|
SharpPulsar
SharpPulsar is Apache Pulsar Client built using Akka.net |
|
|
EasyCompressor.Zstd
An Easy-to-Use and Optimized compression library for .NET that unified several compression algorithms including LZ4, Snappy, Zstd, LZMA, Brotli, GZip, ZLib, and Deflate. This library aids in Improving Performance by Reducing Memory Usage and Bandwidth Usage. |
|
|
DevToDev.Core
Devtodev Core is a dependency for all devtodev packages. It contains common functionality. |
GitHub repositories (16)
Showing the top 16 popular GitHub repositories that depend on ZstdNet:
| Repository | Stars |
|---|---|
|
BeyondDimension/SteamTools
🛠「Watt Toolkit」是一个开源跨平台的多功能 Steam 工具箱。
|
|
|
ThreeMammals/Ocelot
.NET API Gateway
|
|
|
morkt/GARbro
Visual Novels resource browser
|
|
|
toddams/RazorLight
Template engine based on Microsoft's Razor parsing engine for .NET Core
|
|
|
futo-org/Grayjay.Desktop
Read-only mirror of Grayjay.Desktop repo for issue tracking
|
|
|
soulsmods/DSMapStudio
A standalone map/level editor for Demon's Souls, Dark Souls 1/2/3, Bloodborne, Sekiro, and Elden Ring.
|
|
|
vawser/Smithbox
Smithbox is a modding tool for Elden Ring, Armored Core VI, Sekiro, Dark Souls 3, Dark Souls 2, Dark Souls, Bloodborne and Demon's Souls.
|
|
|
overtools/OWLib
DataTool is a program that lets you extract models, maps, and files from Overwatch.
|
|
|
koculu/ZoneTree
ZoneTree is a persistent, high-performance, transactional, and ACID-compliant ordered key-value database for .NET. It operates seamlessly both in-memory and on local/cloud storage, making it an ideal choice for a wide range of applications requiring efficient data management.
|
|
|
UlyssesWu/FreeMote
Managed Emote/PSB tool libs.
|
|
|
mjebrahimi/EasyCompressor
⚡An Easy-to-Use and Optimized compression library for .NET that unified several compression algorithms including LZ4, Snappy, Zstd, LZMA, Brotli, GZip, ZLib, and Deflate. This library aids in Improving Performance by Reducing Memory Usage and Bandwidth Usage. Along with a greate Performance Benchmark between different compression algorithms.
|
|
|
fiddyschmitt/clonezilla-util
Mount Clonezilla images in Windows
|
|
|
apache/pulsar-dotpulsar
The official .NET client library for Apache Pulsar
|
|
|
mhwlng/streamdeck-starcitizen
Elgato Stream Deck button plugin for Star Citizen
|
|
|
SCToolsfactory/SCJMapper-V2
SC Joystick Mapper (.Net 4; using sharpDX wrapper)
|
|
|
RedpointGames/uet
UET (Unreal Engine Tool) makes building and testing Unreal Engine projects and plugins easy. It can distribute builds with BuildGraph, remotely execute automation tests on device and across multiple machines, handles fault tolerance and automatic retries and generally makes the whole experience of automating Unreal Engine a lot more pleasant.
|