快速入门
执行本文档操作前确保已安装了针对鲲鹏优化的ZSTD,详细安装步骤请参见《安装指南》。
命令行压缩解压
创建示例文件。
echo "hello zstd on kunpeng" > sample.txt压缩文件为
.zst格式。zstd sample.txt -o sample.txt.zst解压
.zst文件。zstd -d sample.txt.zst -o sample.out校验解压结果。
diff sample.txt sample.out如果
diff命令无输出,表示压缩和解压结果一致。
C接口块压缩解压示例
本节提供示例演示如何使用ZSTD公开C接口完成一次性内存块压缩和解压。
将以下示例保存为
quick_start.c。#include <stdio.h> #include <stdlib.h> #include <string.h> #include <zstd.h> int main(void) { const char* src = "hello zstd on kunpeng"; size_t srcSize = strlen(src) + 1; int compressionLevel = 3; size_t bound = ZSTD_compressBound(srcSize); void* compressed = malloc(bound); if (compressed == NULL) { fprintf(stderr, "failed to allocate compressed buffer\n"); return 1; } size_t compressedSize = ZSTD_compress(compressed, bound, src, srcSize, compressionLevel); if (ZSTD_isError(compressedSize)) { fprintf(stderr, "compress failed: %s\n", ZSTD_getErrorName(compressedSize)); free(compressed); return 1; } unsigned long long contentSize = ZSTD_getFrameContentSize(compressed, compressedSize); if (contentSize == ZSTD_CONTENTSIZE_ERROR || contentSize == ZSTD_CONTENTSIZE_UNKNOWN) { fprintf(stderr, "failed to get frame content size\n"); free(compressed); return 1; } void* decompressed = malloc((size_t)contentSize); if (decompressed == NULL) { fprintf(stderr, "failed to allocate decompressed buffer\n"); free(compressed); return 1; } size_t decompressedSize = ZSTD_decompress(decompressed, (size_t)contentSize, compressed, compressedSize); if (ZSTD_isError(decompressedSize)) { fprintf(stderr, "decompress failed: %s\n", ZSTD_getErrorName(decompressedSize)); free(decompressed); free(compressed); return 1; } printf("compressed size: %zu\n", compressedSize); printf("decompressed text: %s\n", (const char*)decompressed); free(decompressed); free(compressed); return 0; }使用如下命令编译和运行。
cc quick_start.c -lzstd -o quick_start ./quick_start如果安装在自定义目录,可指定头文件和库路径。
export ZSTD_INSTALL_DIR=/path/to/install/zstd cc quick_start.c \ -I${ZSTD_INSTALL_DIR}/include \ -L${ZSTD_INSTALL_DIR}/lib \ -Wl,-rpath,${ZSTD_INSTALL_DIR}/lib \ -lzstd \ -o quick_start ./quick_start
流式压缩解压
当输入数据无法一次性放入内存,或需要从文件、网络、管道持续读取数据时,可使用ZSTD流式接口。
流式压缩
流式压缩常用步骤如下:
- 使用
ZSTD_createCCtx创建压缩上下文。 - 准备
ZSTD_inBuffer和ZSTD_outBuffer。 - 循环调用
ZSTD_compressStream2,使用ZSTD_e_continue持续输入数据。 - 输入结束后继续调用
ZSTD_compressStream2,使用ZSTD_e_end完成帧收尾,直到返回值为0。 - 使用
ZSTD_freeCCtx释放上下文。
- 使用
流式解压
流式解压常用步骤如下:
- 使用
ZSTD_createDStream创建解压流上下文。 - 准备
ZSTD_inBuffer和ZSTD_outBuffer。 - 循环调用
ZSTD_decompressStream消费压缩输入并输出解压数据。 - 当
ZSTD_decompressStream返回0时,表示当前帧解压完成。 - 使用
ZSTD_freeDStream释放上下文。
- 使用