请教压缩和解压缩算法 LZMA.dll 测试程序

bao20080513shengbin 2009-09-02 08:43:49
我现在想使用 LZMA 压缩算法中的 LZMA.dll ,但总是调试不出来 LzmaCompress zmaUncompress 这两个函数不知参数如何给。请大家帮忙看看
这是压缩部分 我感觉可能主要是参数问题
	HINSTANCE hInst;
hInst = LoadLibrary("LZMA.dll");

typedef int (_stdcall *FuncCompress)(unsigned char *dest,
size_t *destLen,
const unsigned char *src,
size_t srcLen,
unsigned char *outProps,
size_t *outPropsSize, /* *outPropsSize must be = 5 */
int level, /* 0 <= level <= 9, default = 5 */
unsigned dictSize, /* default = (1 << 24) */
int lc, /* 0 <= lc <= 8, default = 3 */
int lp, /* 0 <= lp <= 4, default = 0 */
int pb, /* 0 <= pb <= 4, default = 2 */
int fb, /* 5 <= fb <= 273, default = 32 */
int numThreads /* 1 or 2, default = 2 */
);

FuncCompress MyCompress = (FuncCompress)GetProcAddress(hInst, "LzmaCompress");

if(!MyCompress)
{
MessageBox("获取compress函数地址失败! ");
return;
}

unsigned int dlen = sizeof(m_ucdecompress); //m_ucdecompress 压缩后的数据存储区
size_t *destLen = &dlen; //认为压缩后的数据长度

const unsigned char srcarr[] = "12ac56";//hello hello hello world hello hello hello world
const unsigned char *src = srcarr;
size_t srcLen = sizeof(srcarr);
m_unCompressLen = srcLen; //要压缩的数据长度,在解压时做为解压后的数据长度


unsigned char outpprops[1024]; //这个参数不知什么作用,不知给什么值合适
unsigned char *outProps = outpprops;

unsigned int PropsSize = 5; //这个参数也不知什么作用,其值要求必须是 5
size_t *outPropsSize = &PropsSize; // outPropsSize must be = 5

int level = 5; // 0 <= level <= 9, default = 5
unsigned dictSize = 1 << 24; // default = (1 << 24) 16777216 1000000000000000000000000
int lc = 3; // 0 <= lc <= 8, default = 3
int lp = 0; // 0 <= lp <= 4, default = 0
int pb = 2; // 0 <= pb <= 4, default = 2
int fb = 32; // 5 <= fb <= 273, default = 32
int numThreads = 2; // 1 or 2, default = 2


int status = MyCompress(m_ucdecompress,
destLen,
src,
srcLen,
outProps,
outPropsSize,
level,
dictSize,
lc,
lp,
pb,
fb,
numThreads );

//解压部分不能解压正确 下面是解压部分

HINSTANCE hInst;
hInst = LoadLibrary("LZMA.dll");

typedef int (_stdcall *FuncUnCompress)(unsigned char *dest,
size_t *destLen,
const unsigned char *src,
size_t *srcLen,
const unsigned char *props,
size_t propsSize
);

FuncUnCompress MyUnCompress = (FuncUnCompress)GetProcAddress(hInst, "LzmaUncompress");

if(!MyUnCompress)
{
MessageBox("获取uncompress函数地址失败! ");
return;
}


unsigned char destarr[1024];
unsigned int dlen = m_unCompressLen; // 解压缩后的数据长度 即原文长度
unsigned char *dest = destarr;
size_t *destLen = &dlen;

size_t usrcLen = m_unDeCompressLen; //要解压数据长度
size_t *srcLen = &usrcLen;


const unsigned char outProps[12] = "12345678910"; //这个参数不知何用 也不知给值多少
size_t outPropsSize = 5; // outPropsSize must be = 5

int status = MyUnCompress(dest,
destLen,
m_ucdecompress, //解压数据
srcLen,
outProps,
outPropsSize
);


...全文
777 11 打赏 收藏 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
haiphong 2010-09-10
  • 打赏
  • 举报
回复
int main(int argc, char* argv[])
{
unsigned char szPackebuf[1024];
unsigned char m_pData[90];
unsigned char m_DecData[1024];
unsigned char outProps[5];
size_t outPropsSize = 5;
memset(m_pData,0x12,100);
size_t dstLen = 1024;
int nZRet = LzmaCompress(szPackebuf, &dstLen, m_pData ,100,
outProps,// 这个给解压用的
&outPropsSize,
5,
1 << 24,
3,
0,
2,
32,
1
);
printf("LzmaCompress ret=[%d] NewLen[%d]!\n",nZRet,dstLen);
SizeT destNewLen = 1024;// 这个值如果不改源码 就会得不到正确结果,
// 在不改源码情况下如果 大于上面压缩的长度100 就返回 SZ_ERROR_INPUT_EOF 错
// 如果小于100 返回SZ_OK 但长度是不变的不会是100
unsigned char* destNewSrc = m_DecData;
nZRet = LzmaUncompress(destNewSrc, &destNewLen, szPackebuf, &dstLen,
outProps, 5);
printf("LzmaUncompress ret=[%d] NewLen[%d]!\n",nZRet,destNewLen);
getchar();
return 0;
}
LzmaDec_DecodeToDic 里修改了下

SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,
ELzmaFinishMode finishMode, ELzmaStatus *status)
{
SizeT inSize = *srcLen;
(*srcLen) = 0;
LzmaDec_WriteRem(p, dicLimit);

*status = LZMA_STATUS_NOT_SPECIFIED;

while (p->remainLen != kMatchSpecLenStart)
{
int checkEndMarkNow;

if (p->needFlush != 0)
{
for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--)
p->tempBuf[p->tempBufSize++] = *src++;
if (p->tempBufSize < RC_INIT_SIZE)
{
*status = LZMA_STATUS_NEEDS_MORE_INPUT;
return SZ_OK;
}
if (p->tempBuf[0] != 0)
return SZ_ERROR_DATA;

LzmaDec_InitRc(p, p->tempBuf);
p->tempBufSize = 0;
}

checkEndMarkNow = 0;
if (p->dicPos >= dicLimit)
{
if (p->remainLen == 0 && p->code == 0)
{
*status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK;
return SZ_OK;
}
if (finishMode == LZMA_FINISH_ANY)
{
*status = LZMA_STATUS_NOT_FINISHED;
return SZ_ERROR_OUTPUT_EOF;
}
if (p->remainLen != 0)
{
*status = LZMA_STATUS_NOT_FINISHED;
return SZ_ERROR_DATA;
}
checkEndMarkNow = 1;
}

if (p->needInitState)
LzmaDec_InitStateReal(p);

if (p->tempBufSize == 0)
{
SizeT processed;
const Byte *bufLimit;
if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)
{
int dummyRes = LzmaDec_TryDummy(p, src, inSize);
if (dummyRes == DUMMY_ERROR)
{
memcpy(p->tempBuf, src, inSize);
p->tempBufSize = (unsigned)inSize;
(*srcLen) += inSize;
if(inSize)
*status = LZMA_STATUS_NEEDS_MORE_INPUT;
return SZ_OK;
}
if (checkEndMarkNow && dummyRes != DUMMY_MATCH)
{
*status = LZMA_STATUS_NOT_FINISHED;
return SZ_ERROR_DATA;
}
bufLimit = src;
}
else
bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX;
p->buf = src;
if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0)
return SZ_ERROR_DATA;
processed = (SizeT)(p->buf - src);
(*srcLen) += processed;
src += processed;
inSize -= processed;
}
else
{
unsigned rem = p->tempBufSize, lookAhead = 0;
while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize)
p->tempBuf[rem++] = src[lookAhead++];
p->tempBufSize = rem;
if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)
{
int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem);
if (dummyRes == DUMMY_ERROR)
{
(*srcLen) += lookAhead;
*status = LZMA_STATUS_NEEDS_MORE_INPUT;
return SZ_OK;
}
if (checkEndMarkNow && dummyRes != DUMMY_MATCH)
{
*status = LZMA_STATUS_NOT_FINISHED;
return SZ_ERROR_DATA;
}
}
p->buf = p->tempBuf;
if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0)
return SZ_ERROR_DATA;
lookAhead -= (rem - (unsigned)(p->buf - p->tempBuf));
(*srcLen) += lookAhead;
src += lookAhead;
inSize -= lookAhead;
p->tempBufSize = 0;
}
}
if (p->code == 0)
*status = LZMA_STATUS_FINISHED_WITH_MARK;
return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA;
}
haiphong 2010-09-10
  • 打赏
  • 举报
回复
LzmaUncompress 这个源代码有问题,当你的解压目标空间长度 不等于 未压缩的长度就回报7或6,当目标空间长度过小居然也是0返回。 修改主要是在LzmaDec_DecodeToDic 里改下就可以。outProps 这个参数是你压缩时候的这个,outProps 在你压缩后返回的
ys19011 2010-06-02
  • 打赏
  • 举报
回复
outProps数组中的值,前后不一致,导致解压不成功。
压缩的时候,LZMA会生成几个值,在解压缩的时候也需要使用到这几个来判别在词典中Jump的距离。
jzp12 2009-09-30
  • 打赏
  • 举报
回复
代码比较乱,MS参数用错了:
m_ucdecompress初始值多少?开辟了多大的空间?
把代码发给我,我帮你看看。邮箱是:jingzhongping@163.com
  • 打赏
  • 举报
回复
问题没有解决,换用了 fengrx 的算法。有知道的朋友们说一下呀。
  • 打赏
  • 举报
回复
我试过了还是不行,解压不正确,这两个参数到底给什么值合适呢。

压缩数据长度 7
压缩后的数据长度 12
压缩数据: 12ac56
压缩后数据: 寛?)Q暋€

解压数据长度: 12
解压后的数据长度 7
解压数据: 寛?)Q暋€
解压后的数据: 12^=Ul

结果就是前两个个字符是正确的,后面都不正确,解压中的outProps参数 对这个结果也有影响。有谁知道看看呀。
danxuezx 2009-09-02
  • 打赏
  • 举报
回复
直接调用系统的压缩解压不可以吗……
nihaoyiyou019 2009-09-02
  • 打赏
  • 举报
回复
没用过这个动态库,但是看了你贴上来的程序,我觉得应该是你的outProps参数的问题,初步觉得这个参数应该是解压的时候一个编码/解码过程中要用到的编码/解码的中间状态的缓冲区。再有就是你的解压数据的存储缓冲区应该在解压之前将m_ucdecompress用memset进行置零操作
fengrx 2009-09-02
  • 打赏
  • 举报
回复
没有使用过这个库,但使用过zlib库,很好用,压缩解压缩很方便。
压缩:
compress2(dstbuffer, &streamlen, buffer, buffersize, Z_BEST_COMPRESSION);
看下定义:
ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
const Bytef *source, uLong sourceLen,
int level));
当然也可以使用compress,定义如下:
ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
const Bytef *source, uLong sourceLen));

解压缩uncompress,看定义:
ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
const Bytef *source, uLong sourceLen));
  • 打赏
  • 举报
回复
大家帮忙看看呀。
Conry 2009-09-02
  • 打赏
  • 举报
回复
这样看不出什么来,最好打包代码传上来
源码直接下载地址: https://pan.quark.cn/s/387d7c8f6289 在使用IE浏览器的过程中,偶尔会出现重置为默认配置操作未能顺利完成的现象。这种情况的发生可能源于多种因素,包括注册表项出现偏差、浏览器附加组件之间存在不兼容、操作系统授权设置不当或受到恶意程序影响等。针对这一挑战,我们可以通过一系列系统性的方法来逐一诊断和纠正。首先需要验证当前用户是否具备管理员级别的操作权限。在执行重置配置的操作时,必须确保IE浏览器是以管理员身份启动的。具体操作方式为,使用鼠标右键单击IE程序图标,并从弹出的菜单中选择“以管理员身份运行”这一选项。其次,应当检查是否存在恶意软件。恶意程序有时会非法修改浏览器的配置信息,从而阻碍重置过程的正常进行。用户可以借助Windows系统自带的Microsoft Safety Scanner进行检测,或者选择安装并使用第三方安全防护软件执行全面的系统扫描。紧接着,需要对浏览器的缓存数据以及Cookies文件进行清理。在IE浏览器界面中,通过访问“工具”菜单并选择“Internet选项”,然后在弹出的设置界面中,切换至“常规”标签页,并执行清除浏览历史记录的操作,此过程应包含Cookies和临时互联网文件。倘若上述步骤均未能解决问题,那么可以考虑禁用或移除那些可能引发冲突的浏览器附加组件。相关操作需要在“工具”菜单下找到并打开“管理加载项”,对可疑的插件进行禁用处理,并在浏览器重新启动后再次尝试执行重置操作。再者,修复IE浏览器相关的注册表配置也是至关重要的环节。注册表编辑器是一个功能强大的系统工具,任何不当的操作都可能导致严重的系统问题,因此在进行修改前必须创建系统还原点作为安全备份。用户可以通过按下“Win+R”组合...
内容概要:本文详细介绍了光伏储能虚拟同步发电机(VSG)并网仿真模型的Simulink实现方法,系统研究了光伏发电与储能系统融合VSG技术并入电网的动态特性与控制策略。通过构建完整的VSG控制模块,模拟其在并网过程中的虚拟惯性响应、频率调节能力和有功无功功率支撑特性,验证了该系统在增强电网稳定性、提升新能源并网适应性方面的有效性。模型全面涵盖光伏出力特性、储能系统充放电管理、VSG有功-无功解耦控制、下垂控制机制以及并网点动态响应等关键环节,并通过多种工况下的仿真分析,评估系统在不同运行条件下的动态性能与鲁棒性。; 适合人群:具备电力系统、新能源发电、自动控制等相关专业背景,熟悉Matlab/Simulink仿真环境,从事新能源并网、微电网控制或电力电子系统研究的科研人员、工程技术人员及研究生。; 使用场景及目标:①深入理解光伏储能系统如何通过VSG技术模拟同步发电机的惯性和阻尼特性以支持电网稳定;②掌握虚拟惯量控制、下垂控制等VSG核心控制策略在Simulink中的建模、参数设计与实现方法;③为新型电力系统中新能源并网的动态仿真、稳定性分析及控制策略优化提供可靠的模型基础和技术参考。; 阅读建议:建议结合所提供的仿真模型进行逐步操作与参数调试,重点关注VSG控制环路的结构设计、控制器参数整定及其对系统动态性能的影响,同时可将该模型拓展应用于多机并联、微电网孤岛/并网切换、多能源协同控制等更复杂的系统场景中进行进阶研究。

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧