使用案例
ZSTD压缩算法提供了两种常见的接口调用方式:CTX接口和简单接口。本章节以简单接口调用KZstar库为例提供完整的接口使用示例。
- CTX接口:提供了更高的灵活性和控制,允许用户通过管理压缩/解压上下文(ZSTD_CCtx和ZSTD_DCtx)来进行更细粒度的操作。使用CTX接口,用户可以手动控制压缩过程中的各项参数,并且能够更加精细地调整压缩行为。
- 简单接口:相较于CTX接口,简单接口则提供了更加简洁和易用的调用方式。用户无需关心上下文的管理和复杂的参数配置。
CTX接口示例
char* zstd_init() { zstd_params_s* zstd_params = (zstd_params_s*) malloc(sizeof(zstd_params_s)); if (!zstd_params) return NULL; zstd_params->cctx = ZSTD_createCCtx(); zstd_params->dctx = ZSTD_createDCtx(); zstd_params->cdict = NULL; return (char*) zstd_params; } int64_t zstd_compress(char *inbuf, size_t insize, char *outbuf, size_t outsize, size_t level, char* workmem) { size_t res; zstd_params_s* zstd_params = (zstd_params_s*) workmem; if (!zstd_params || !zstd_params->cctx) return 0; zstd_params->zparams = ZSTD_getParams(level, insize, 0); ZSTD_CCtx_setParameter(zstd_params->cctx, ZSTD_c_compressionLevel, level); zstd_params->zparams.fParams.contentSizeFlag = 1; res = ZSTD_compressCCtx(zstd_params->cctx, outbuf, outsize, inbuf, insize, level); if (ZSTD_isError(res)) return res; return res; } int64_t zstd_decompress(char *inbuf, size_t insize, char *outbuf, size_t outsize, char* workmem) { zstd_params_s* zstd_params = (zstd_params_s*) workmem; if (!zstd_params || !zstd_params->dctx) return 0; return ZSTD_decompressDCtx(zstd_params->dctx, outbuf, outsize, inbuf, insize); } void zstd_deinit(char* workmem) { zstd_params_s* zstd_params = (zstd_params_s*) workmem; if (!zstd_params) return; if (zstd_params->cctx) ZSTD_freeCCtx(zstd_params->cctx); if (zstd_params->dctx) ZSTD_freeDCtx(zstd_params->dctx); if (zstd_params->cdict) ZSTD_freeCDict(zstd_params->cdict); free(workmem); }
简单接口示例
// 1. 输入数据 const char *input_data = "This is the input data that we want to compress using ZSTAR!"; size_t insize = strlen(input_data) + 1; // 2. 分配内存 size_t compress_bound = ZSTD_compressBound(insize); void *outbuf = malloc(compress_bound); // 3. 压缩数据 size_t compressed_size = ZSTD_compress(outbuf, compress_bound, input_data, insize, 3); // 使用压缩级别 3 // 4. 解压数据 size_t dst_size = ZSTD_getFrameContentSize(outbuf, compressed_size); // 获取解压后的数据大小 void *decompressed_data = malloc(dst_size); size_t decompressed_size = ZSTD_decompress(decompressed_data, dst_size, outbuf, compressed_size);
简单接口使能KZstar示例
- 以简单接口调用为例,编写验证程序。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <zstd.h> int main() { const char *input_data = "This is the input data that we want to compress using KZSTAR!"; size_t insize = strlen(input_data) + 1; size_t compress_bound = ZSTD_compressBound(insize); void *outbuf = malloc(compress_bound); if (outbuf == NULL) { fprintf(stderr, "Failed to allocate memory for compression buffer.\n"); return 1; } size_t compressed_size = ZSTD_compress(outbuf, compress_bound, input_data, insize, 3); if (ZSTD_isError(compressed_size)) { fprintf(stderr, "Compression failed: %s\n", ZSTD_getErrorName(compressed_size)); free(outbuf); return 1; } printf("Data successfully compressed! Compressed size: %zu\n", compressed_size); size_t dst_size = ZSTD_getFrameContentSize(outbuf, compressed_size); void *decompressed_data = malloc(dst_size); if (decompressed_data == NULL) { fprintf(stderr, "Failed to allocate memory for decompression buffer.\n"); free(outbuf); return 1; } size_t decompressed_size = ZSTD_decompress(decompressed_data, dst_size, outbuf, compressed_size); if (ZSTD_isError(decompressed_size)) { fprintf(stderr, "Decompression failed: %s\n", ZSTD_getErrorName(decompressed_size)); free(outbuf); free(decompressed_data); return 1; } printf("Data successfully decompressed! Decompressed size: %zu\n", decompressed_size); printf("Decompressed data: %s\n", (char *)decompressed_data); free(outbuf); free(decompressed_data); return 0; }
- 根据KZstar的安装位置,配置对应环境变量。
1
export LD_LIBRARY_PATH=/usr/local/kzstar/lib:$LD_LIBRARY_PATH
- 编译程序。
1
gcc -o ZstdSimpleCompress ZstdSimpleCompress.c -lzstd
- 查看是否正确链接KZstar库。
1
ldd ZstdSimpleCompress
回显如下所示,表示程序已正确链接KZstar库。1 2 3 4 5 6
linux-vdso.so.1 (0x0000ffff83646000) libzstd.so.1 => /usr/local/kzstar/lib/libzstd.so.1 (0x0000ffff83528000) libc.so.6 => /usr/lib64/libc.so.6 (0x0000ffff83379000) libzstar.so => /usr/local/kzstar/lib/libzstar.so (0x0000ffff83348000) /lib/ld-linux-aarch64.so.1 (0x0000ffff83609000) libsecurec.so => /usr/local/kzstar/lib/libsecurec.so (0x0000ffff83317000)
- 运行可执行程序。
1
./ZstdSimpleCompress
输出结果如下。1 2 3
Data successfully compressed! Compressed size: 70 Data successfully decompressed! Decompressed size: 61 Decompressed data: This is the input data that we want to compress using KZSTAR!