Zstandard 新型压缩算法


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;

结束


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM