| 
 | 
 
<火山程序 类型 = "通常" 版本 = 1 /> 
 
包 星火.zstd 
 
类 ZSTD <公开 @全局类 = 真 @视窗.头文件搜寻目录 = "zstd\\include" @视窗.外部头文件 = "zstd.h" 
        @视窗.附属文件.non_static = "zstd\\$(p)\\$(d)\\dynamic\\bin\\zstd.dll" 
        @视窗.外部库 = "zstd\\$(p)\\$(d)\\$(lm)\\lib\\zstd.lib" "" "@视窗.外部库.debug-static" = "msvcrtd.lib" 
        "@视窗.外部库.release-static" = "msvcrt.lib" "" @视窗.需求VS版本.static = "17-"> 
{ 
    方法 ZSTD_取版本 <公开 静态 类型 = 文本型 @嵌入式方法 = ""> 
    { 
        @ CVolString(ZSTD_versionString()) 
    } 
 
    方法 ZSTD_压缩 <公开 静态 类型 = 字节集类 折叠> 
    参数 欲压缩数据 <类型 = 字节集类> 
    参数 压缩等级 <类型 = 整数 注释 = "1-22,默认3" @默认值 = 3> 
    { 
        变量 结果 <类型 = 字节集类> 
        @ @<结果>.Alloc (ZSTD_compressBound(@<欲压缩数据>.GetSize ()), false); 
        @ size_t compressedSize = ZSTD_compress(@<结果>.GetPtr(), @<结果>.GetSize (),@<欲压缩数据>.GetPtr(), @<欲压缩数据>.GetSize(), @<压缩等级>); 
        @ if (ZSTD_isError(compressedSize))return CVolMem(); 
        @ @<结果>.Realloc (compressedSize); 
        返回 (结果) 
    } 
 
    方法 ZSTD_解压 <公开 静态 类型 = 字节集类 折叠> 
    参数 欲解压数据 <类型 = 字节集类> 
    { 
        变量 结果 <类型 = 字节集类> 
        @ @<结果>.Alloc (ZSTD_getDecompressedSize(@<欲解压数据>.GetPtr(), @<欲解压数据>.GetSize()), false); 
        @ if (ZSTD_isError(ZSTD_decompress(@<结果>.GetPtr(), @<结果>.GetSize (), @<欲解压数据>.GetPtr(), @<欲解压数据>.GetSize())))return CVolMem(); 
        返回 (结果) 
    } 
} 
 
类 zstd压缩类 <公开 注释 = "适合连续压缩数据,一个对象只能同时被一个线程操作" @强制依赖 = "ZSTD"> 
{ 
 
    # @begin 
    # <> <include> 
    #     ZSTD_CCtx* cctx; 
    # <> </include> 
    # @end 
 
    方法 类_初始化 
    { 
        @ cctx = ZSTD_createCCtx(); 
    } 
 
    方法 类_清理 
    { 
        @ ZSTD_freeCCtx(cctx); 
    } 
 
    方法 压缩等级 <公开 属性写> 
    参数 等级 <类型 = 整数 注释 = "默认为3 1到22"> 
    { 
        @ ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, @<等级>); 
    } 
 
    方法 线程数 <公开 属性写 @视窗.外部头文件 = "<thread>"> 
    参数 数量 <类型 = 整数 注释 = "默认为0 单线程,-1为CPU核心数"> 
    { 
        @ if(@<数量> == -1)@<数量> = std::thread::hardware_concurrency(); 
        @ ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, @<数量>); 
    } 
 
    方法 速度 <公开 属性写> 
    参数 挡位 <类型 = 整数 注释 = "默认为2 1到9,数值越小,速度越快,压缩比越低"> 
    { 
        @ ZSTD_CCtx_setParameter(cctx, ZSTD_c_strategy, @<挡位>); 
    } 
 
    方法 压缩 <公开 类型 = 字节集类> 
    参数 欲压缩数据 <类型 = 字节集类> 
    参数 压缩等级 <类型 = 整数 注释 = "1-22,默认3" @默认值 = 3> 
    { 
        变量 结果 <类型 = 字节集类> 
        @ @<结果>.Alloc (ZSTD_compressBound(@<欲压缩数据>.GetSize ()) , false); 
        @ size_t compressedSize = ZSTD_compress2(cctx, @<结果>.GetPtr(), @<结果>.GetSize (), @<欲压缩数据>.GetPtr(), @<欲压缩数据>.GetSize()); 
        @ if (ZSTD_isError(compressedSize))return CVolMem(); 
        @ @<结果>.Realloc (compressedSize); 
        返回 (结果) 
    } 
} 
 
类 zstd解压类 <公开 注释 = "适合连续解压数据,一个对象只能同时被一个线程操作" @强制依赖 = "ZSTD"> 
{ 
 
    # @begin 
    # <> <include> 
    #     ZSTD_DCtx* dctx; 
    # <> </include> 
    # @end 
 
    方法 类_初始化 
    { 
        @ dctx = ZSTD_createDCtx(); 
    } 
 
    方法 类_清理 
    { 
        @ ZSTD_freeDCtx(dctx); 
    } 
 
    方法 解压 <公开 类型 = 字节集类> 
    参数 欲解压数据 <类型 = 字节集类> 
    { 
        变量 结果 <类型 = 字节集类> 
        @ @<结果>.Alloc (ZSTD_getDecompressedSize(@<欲解压数据>.GetPtr(), @<欲解压数据>.GetSize()), false); 
        @ size_t decompressedSize = ZSTD_decompressDCtx(dctx, @<结果>.GetPtr(), @<结果>.GetSize (), @<欲解压数据>.GetPtr(), @<欲解压数据>.GetSize()); 
        @ if (ZSTD_isError(decompressedSize))return CVolMem(); 
        返回 (结果) 
    } 
} 
 |   
 
 
 
 |