aixunsoft
发表于 2025-2-6 20:39:00
urenai 发表于 2025-2-6 20:15
大哥 你能不能放源码版本出来,
有选择的话,肯定源码版优先啊
<火山程序 类型 = "通常" 版本 = 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();
返回 (结果)
}
}
aixunsoft
发表于 2025-2-6 20:40:41
urenai 发表于 2025-2-6 20:15
大哥 你能不能放源码版本出来,
有选择的话,肯定源码版优先啊
这边的库引用改成你自己编译的zstd库文件路径就可以了。
高山!&流水
发表于 2025-2-6 20:57:32
谢谢分享
urenai
发表于 2025-2-6 21:31:22
aixunsoft 发表于 2025-2-6 20:40
这边的库引用改成你自己编译的zstd库文件路径就可以了。
动动小手啊,打包一份
让我栞栞谁没6星
发表于 2025-2-6 23:20:32
我一开始也想封一个的,结果失败了,前来学习一下楼主是怎么写的:噜阿噜
lichenxui
发表于 2025-2-7 09:41:53
66666
aixunsoft
发表于 2025-2-7 18:00:00
Xelloss0618 发表于 2025-2-5 18:13
高版本可以兼容低版本编译的LIB,反过来不行
有些没有必须vs2022才能编译的代码编译的lib用vs2019是可以运行的,
这个库vs2022编译的,我用火山自带的vs2019静态编译是可以正常运行的,有没有其他副作用就不知道了。
Xelloss0618
发表于 2025-2-7 18:07:04
aixunsoft 发表于 2025-2-7 18:00
有些没有必须vs2022才能编译的代码编译的lib用vs2019是可以运行的,
这个库vs2022编译的,我用火山自带的 ...
纯C语言的库,的确可以高版本编译,低版本也能用,C++的就不行了
aixunsoft
发表于 2025-2-7 18:12:29
Xelloss0618 发表于 2025-2-7 18:07
纯C语言的库,的确可以高版本编译,低版本也能用,C++的就不行了
原来如此,受教了
888888
发表于 2025-2-7 18:59:06
谢谢分享