Zstd 壓縮算法
簡介
Zstandard(縮寫為Zstd)是由Facebook的Yann Collet開發的一個無損數據壓縮算法。Zstandard在設計上與DEFLATE(.zip、gzip)算法有着差不多的壓縮比,但有更高的壓縮和解壓縮速度。
Zstandard使用字典算法(LZ77)結合熵編碼法的有限狀態熵(tANS)。-----Wikipedia
正文
在Windows 下 Build
很簡單,進入\build\VS_scripts目錄下根據不同環境運行相應的腳本即可!
- 在項目中包含頭文件#include "zstd/zstd.h"
- //#pragma comment(lib,"libzstd.lib");
- 在項目exe目錄下面加入libzstd.dll文件
- 在項目lib文件夾(或者其他什么文件夾)加入libzstd.lib
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()).
* 將 "src" 內容壓縮為一個單一的 zstd 壓縮幀,放入已經分配的 "dst"中。
* 提示:如果`dstCapacity` >= `ZSTD_compressBound(srcSize)`,壓縮運行速度更快。
* @return : 壓縮大小寫入`dst` (<= `dstCapacity)。
* 如果失敗,則為錯誤代碼(可以使用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()).
* `compressedSize` : 必須是一些被壓縮和/或可跳過的幀的確切大小。
* `dstCapacity`是 originalSize 的上界。
* 如果用戶不能暗示一個最大的上界,最好使用流媒體模式來解壓數據。
* @return : 解壓到`dst`的字節數(<= `dstCapacity`)。
* 如果失敗,則是一個errorCode(可以用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_getFrameContentSize
來獲取壓縮后最大緩沖區大小,來申請解壓緩沖區;
size_t dstSize = ZSTD_decompress(pDest, szBufSize, pSource, szSrcSize);
if (ZSTD_isError(dstSize))
{
return -1;
}
return dstSize;