鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

使用案例

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示例

  1. 以简单接口调用为例,编写验证程序。
    #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;
    }
  2. 根据KZstar的安装位置,配置对应环境变量。
    1
    export LD_LIBRARY_PATH=/usr/local/kzstar/lib:$LD_LIBRARY_PATH
    
  3. 编译程序。
    1
    gcc -o ZstdSimpleCompress ZstdSimpleCompress.c -lzstd
    
  4. 查看是否正确链接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)
    
  5. 运行可执行程序。
    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!