歡迎訪問我的個人博客 ,原文鏈接
簡介
Zstandard(縮寫為Zstd)是由Facebook的Yann Collet開發的一個無損數據壓縮算法。Zstandard在設計上與DEFLATE(.zip、gzip)算法有着差不多的壓縮比,但有更高的壓縮和解壓縮速度。
Zstandard使用字典算法(LZ77)結合熵編碼法的有限狀態熵(tANS)。-----Wikipedia
| Compressor name | Ratio | Compression | Decompress. |
|---|---|---|---|
| zstd 1.1.3 -1 | 2.877 | 430 MB/s | 1110 MB/s |
| zlib 1.2.8 -1 | 2.743 | 110 MB/s | 400 MB/s |
| brotli 0.5.2 -0 | 2.708 | 400 MB/s | 430 MB/s |
| quicklz 1.5.0 -1 | 2.238 | 550 MB/s | 710 MB/s |
| lzo1x 2.09 -1 | 2.108 | 650 MB/s | 830 MB/s |
| lz4 1.7.5 | 2.101 | 720 MB/s | 3600 MB/s |
| snappy 1.1.3 | 2.091 | 500 MB/s | 1650 MB/s |
| lzf 3.6 -1 | 2.077 | 400 MB/s | 860 MB/s |
正文
在Windows下Build
很簡單,進入\build\VS_scripts目錄下根據不同環境運行相應的腳本即可!
- 在項目中包含頭文件#include "zstd/zstd.h"
- //#pragma comment(lib,"libzstd.lib");
- 在項目exe目錄下面加入libzstd.dll文件
- 在項目lib文件夾(或者其他什么文件夾)加入libzstd.lib

四個Simple API
/*! ZSTD_compress() :
* Compresses `src` content as a single zstd compressed frame into already allocated `dst`.
* Hint : compression runs faster if `dstCapacity` >= `ZSTD_compressBound(srcSize)`.
* @return : compressed size written into `dst` (<= `dstCapacity),
* or an error code if it fails (which can be tested using ZSTD_isError()). */
ZSTDLIB_API size_t ZSTD_compress( void* dst, size_t dstCapacity,
const void* src, size_t srcSize,
int compressionLevel);
/*! ZSTD_decompress() :
* `compressedSize` : must be the _exact_ size of some number of compressed and/or skippable frames.
* `dstCapacity` is an upper bound of originalSize.
* If user cannot imply a maximum upper bound, it's better to use streaming mode to decompress data.
* @return : the number of bytes decompressed into `dst` (<= `dstCapacity`),
* or an errorCode if it fails (which can be tested using ZSTD_isError()). */
ZSTDLIB_API size_t ZSTD_decompress( void* dst, size_t dstCapacity,
const void* src, size_t compressedSize);
ZSTDLIB_API unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize);
/*!< maximum compressed size in worst case scenario */
ZSTDLIB_API size_t ZSTD_compressBound(size_t srcSize);
壓縮流程:
- 使用ZSTD_compressBound獲取最大壓縮緩沖區大小,然后申請緩沖區;
- 使用ZSTD_compress進行壓縮
//可以設定壓縮等級 1 up to ZSTD_maxCLevel()
size_t dstSize = ZSTD_compress(pDest, szBufSize, pSource, szSrcSize, iCompressLevel);
if (ZSTD_isError(dstSize))
{
return -1;
}
return dstSize;
解壓流程:
- 可以使用ZSTD_getDecompressedSize來獲取壓縮后最大緩沖區大小;來申請解壓緩沖區;
size_t dstSize = ZSTD_decompress(pDest, szBufSize, pSource, szSrcSize);
if (ZSTD_isError(dstSize))
{
return -1;
}
return dstSize;
