Zstandard(Zstd)新型壓縮算法代替Zlib 簡單使用教程


歡迎訪問我的個人博客 ,原文鏈接

簡介

Zstandard(縮寫為Zstd)是由Facebook的Yann Collet開發的一個無損數據壓縮算法。Zstandard在設計上與DEFLATE(.zip、gzip)算法有着差不多的壓縮比,但有更高的壓縮和解壓縮速度。
Zstandard使用字典算法(LZ77)結合熵編碼法的有限狀態熵(tANS)。-----Wikipedia

GitHub上的zstd頁面

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

image

四個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;

結束


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM