ZSTD 1.5.4压缩≤4字节数据报错,求可行解决方案
解决ZSTD 1.5.4压缩≤4字节数据报错的问题
你遇到的问题根源是手动计算的目标缓冲区大小不足——ZSTD哪怕压缩极小的数据,也需要足够空间存储帧头、校验等元信息,你当前的估算公式没覆盖这种场景。
解决方法
直接使用ZSTD官方提供的ZSTD_compressBound()函数计算所需的最小目标缓冲区大小,这个函数会根据输入数据大小返回确保能容纳压缩结果的最小字节数,完全适配包括小数据在内的所有场景。
修改后的测试代码
#include <iostream> #include <windows.h> #include <assert.h> #include "zstd.h" #pragma comment(lib, "libzstd_static.lib") int main() { const size_t srcSize = 4; char src[srcSize] = {0x0 ,0x0 ,0x0 ,0x0 }; // 用ZSTD_compressBound获取所需的最小缓冲区大小 size_t dstSize = ZSTD_compressBound(srcSize); char* dst = new char[dstSize]; size_t const countSize = ZSTD_compress((void*)dst, dstSize, (const void*)src, srcSize, 3); if (ZSTD_isError(countSize)) { // 打印错误信息方便排查 std::cout << "压缩错误: " << ZSTD_getErrorName(countSize) << std::endl; assert(!ZSTD_isError(countSize)); } else { std::cout << "压缩后大小: " << countSize << std::endl; } delete[] dst; return 0; }
补充说明
ZSTD_compressBound()的计算逻辑已经考虑了ZSTD帧结构的所有开销,对于4字节数据,它返回的大小完全能容纳你期望的17字节压缩结果。- 如果仍有报错,调用
ZSTD_getErrorName(countSize)可以查看具体错误类型,方便进一步定位问题。
内容的提问来源于stack exchange,提问作者Pavel12398
相关产品推荐
相关产品推荐

